2012-02-09 11 views
6

Uno dei principi principali di MVC è la visualizzazione dei dati mai. Questo principio viene ripetuto più volte nella sessione 116 del WWDC. Ma allora perché lo (una vista) è il UIImage (un modello)? Non viola il principio di cui sopra?Perché UIImageView possiede UIImage. Violi i principi MVC?

O frainteso qualcosa qui? Forse solo perché UIImageView ha una proprietà image non significa che sia proprietaria di UIImage?

risposta

7

La parola proprio viene spesso utilizzata solo per indicare che un oggetto ne ha trattenuto un altro. Ovviamente, una vista che visualizza un'immagine dovrebbe mantenere quell'immagine per tutto il tempo necessario. Ma questa nozione di "proprietà" è molto limitata e non significa che la visione debba essere responsabile della memorizzazione, della modifica o della gestione dell'immagine.

+0

Quindi vuol dire che UIImageView non dovrebbe mai cambiare direttamente la UIImage, lasciando il lavoro a un UIController giusto? Ha senso, grazie =) –

+0

Ma perché UIImageView ha bisogno di conservare l'immagine? Ha solo bisogno di quell'immagine nel momento in cui si disegna a schermo giusto? –

+2

UIImageView necessita di un riferimento all'immagine perché potrebbe essere necessario ridisegnare se stessa e i dati necessari per farlo è l'immagine. Se non mantiene l'immagine, l'immagine potrebbe essere facilmente deallocata in qualsiasi momento e la vista verrà lasciata con un puntatore non valido (e probabilmente in crash). Mantiene l'immagine che sta usando fino a quando qualcuno gli dice di usare qualche altra immagine. – Caleb

4

Buona domanda. A mio parere, UIImageView non "possiede" la UIImage, ma ovviamente deve avere un riferimento ad essa. UIImageView non crea un'istanza dell'immagine.

Lo stesso argomento potrebbe essere fatto per un UILabel (una vista) con una proprietà di testo (un modello).

+0

Perché è necessario avere un riferimento a un UIImmagine? Normalmente ci sarà un controller in piedi tra la vista e il modello. Quando il modello cambia, notificherà il controller, quindi il controller dirà alla vista di eseguire nuovamente il rendering. Ma qui, UIImageView esegue nuovamente il rendering automaticamente quando viene modificata la proprietà dell'immagine. Sì, sembra davvero stupido quando devi separare un UILabel e la sua proprietà testuale, ma questo non è l'ideale che predica MVC, vero? –

+0

In un modello MVC puro, il controller "possiede" e contiene riferimenti sia alla vista che al modello. La vista avrà un riferimento al modello e sa come visualizzarsi. Il controllore è comunque responsabile di comunicare alla vista quale istanza di modello utilizzare. – picciano

+0

Accetto. Ma la vista non ha bisogno di un modello nella sua lista di ivar (o elenco di proprietà). Può avere solo un metodo come '- (void) renderWithModel: (Modello *) m;' - che verrà chiamato dal controller quando il modello viene modificato correttamente? Capisco perfettamente se UIKit fa in modo che UIImageView abbia una proprietà immagine per il motivo delle prestazioni (perché ha bisogno di un controller per una cosa così banale), ma in qualche modo viola l'ideale MVC che ho in mente. –

1

Tecnicamente, uno UIImageView non possiede un'immagine, mantiene un riferimento allo dell'immagine copia per renderlo in modo efficiente. UIImage sembra essere immutabile, quindi una copia è la stessa istanza dell'originale.

UILabel si comporta in modo identico, ma dichiara esplicitamente la sua proprietà text come copy.

+0

Grazie per aver sollevato il punto mutevole/immutabile :) –