Лучший способ определить поведение представления, содержащего представление - PullRequest
1 голос
/ 26 марта 2012

Моя ситуация:

ClassA может иметь или не иметь родителя типа ClassB. Поэтому высказывание [instanceOfA.superview somethingClassBSpecific]; наполовину опасно. Плюс, Xocde разозлится, по уважительной причине.

Является ли рекомендация здесь для отправки уведомления или выполнения некоторой логики в суперпредставлении, например,

if([objectOfA.superview respondsToSelector:somethingClassBSpecific] != nil){
    //...
}

Или создать делегата типа ClassB, где позволяет ситуация?

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Как это часто бывает, это зависит . Использование иерархии представлений, уведомлений и делегирования - это три различных способа взаимодействия объектов друг с другом. Чтобы решить, какой из них (если таковой имеется) является наиболее подходящим, необходимо подумать о том, как рассматриваемые объекты связаны друг с другом.

Уведомления обеспечивают очень слабую (почти нулевую) связь между объектами. Они также обеспечивают связь «один ко многим» - вы публикуете уведомление, и каждый объект, который прослушивает это уведомление, получит сообщение. Но уведомления не всегда уместны; связь в основном только в одном направлении, и злоупотребление механизмом уведомления может привести к проблемам с производительностью.

Делегирование дает вам возможность настроить поведение объекта. Наиболее очевидным примером является делегат приложения. Большинство приложений для iOS основаны на одном классе: UIApplication. UIApplication одинаково для каждого приложения, даже если каждое приложение выполняет свою функцию. Объект приложения использует делегат для обеспечения настройки, которая придает приложению уникальное поведение.

Иерархия представлений - это еще один способ соединения (некоторых) объектов друг с другом. Если реализуемое вами поведение является а) частью представления и б) зависит от отношения этого представления с другими представлениями, то может иметь смысл использовать свойства superview и subviews.

Итак, какую функциональность вы пытаетесь реализовать?

2 голосов
/ 26 марта 2012

Это зависит от вашей логической модели.Если у вас есть экземпляр класса, реализующего протокол с необязательными методами, тогда использование respondsToSelector: целесообразно, когда вы пытаетесь вызвать один из этих необязательных методов.Если вы хотите, чтобы метод, который вы вызываете, был обязательным, создайте «охранник», который ничего не делает, в передаваемых вами классах.Оба метода верны, вопрос только в том, хотите ли вы, чтобы ваши пользователи осознавали необходимость внедрения определенного метода.

...