6

Одним из основных принципов MVC является просмотр в никогда собственные данные. Этот принцип повторяется много раз в сессии WWDC 116. Но тогда почему UIImageView (вид) принадлежит UIImage (модель)? Разве это не нарушает вышеуказанный принцип?Почему UIImageView принадлежит UIImage. Нарушает ли он принципы MVC?

Или я ничего не понимаю здесь? Может быть, просто потому, что у UIImageView есть свойство image не означает, что он владеет этим UIImage?

ответ

7

Слово own часто используется для обозначения того, что один объект сохранил другой. Очевидно, что представление, отображающее изображение, должно сохранять это изображение до тех пор, пока оно ему нужно. Но это понятие «собственности» очень ограничено, и это не означает, что представление должно отвечать за хранение, изменение или иное управление изображением.

+0

Значит, UIImageView никогда не должен напрямую изменять UIImage, оставляя эту работу в UIController правильно? Понятно, спасибо =) –

+0

Но почему UIImageView нужно сохранить изображение? Он просто нуждается в этом изображении в тот момент, когда он сам рисует, чтобы правильно экранировать? –

+2

UIImageView нуждается в ссылке на изображение, потому что ему может потребоваться перерисовать себя, и данные, которые ему нужно сделать, это изображение. Если он не сохранит изображение, изображение может быть легко освобождено в любое время, и в представлении будет указатель с недопустимым указателем (и, возможно, сбой). Он сохраняет изображение, которое он использует, пока кто-то не попросит его использовать другое изображение. – Caleb

4

Хороший вопрос. На мой взгляд, UIImageView не «владеет» UIImage, но, очевидно, ему нужно иметь ссылку на него. UIImageView не создает экземпляр изображения.

Тот же аргумент может быть сделан для UILabel (вид), имеющего свойство text (модель).

+0

Зачем нужна ссылка на UIImage? Обычно между представлением и моделью должен стоять контроллер. Когда модель изменится, она сообщит об этом контроллеру, а затем контроллер отобразит представление для повторной обработки. Но здесь UIImageView автоматически перерисовывает, когда изменяется его свойство изображения. Да, это действительно звучит глупо, когда вам нужно отделить UILabel и его свойство текста, но это не идеальные проповеди MVC, не так ли? –

+0

В чистой модели MVC контроллер будет «владеть» и содержать ссылки как на представление, так и на модель. Представление будет иметь ссылку на модель и знать, как отображать себя. Контроллер по-прежнему несет ответственность за представление представления, которое использует экземпляр модели. – picciano

+0

Согласен. Но представление не нуждается в модели в своем списке ivar (или списке свойств). Он может просто иметь такой метод, как '- (void) renderWithModel: (Model *) m;' - который будет вызываться контроллером, когда модель будет изменена правильно? Я полностью понимаю, что UIKit заставляет UIImageView иметь свойство изображения по соображениям производительности (зачем нужен контроллер для такой тривиальной вещи), но тогда он каким-то образом нарушает идеальный MVC, который у меня на уме. –

1

Технически, UIImageView не имеет изображения, оно содержит ссылку на изображение копия, чтобы иметь возможность эффективно ее рендерить. UIImage просто оказывается неизменным, поэтому копия - это тот же экземпляр, что и оригинал.

UILabel ведет себя идентично, но явно объявляет его text как copy.

+0

Спасибо, что подняли изменчивую/неизменяемую точку :) –

Смежные вопросы