Pull to refresh

Comments 12

А теперь смотрим, как сделан UITableViewController, что-то я там не видел property типа UITableView *view.

Apple меняет подклассы.

Я поставил брейкпойнт во viewDidLoad и посмотрел типы view (через po view в консоли). Результаты:
UITableViewController — UITableView
UICollectionViewController — UICollectionViewControllerWrapperView у которого только один дочерний UICollectionView

Более того, можно заменить даже класс CALayer для UIView. Для этого есть type property в классе UIView:
open class var layerClass: AnyClass { get }

можно, но никто не перекрывает UIView *view, а добавляют новое типизированное свойство

С UICollectionViewController кстати отличный пример: тип self.view никого не должен интересовать, это свойство как правило используется только для создания иерархии childViewController или subviews на этом экране. А для доступа к collectionView есть отдельное свойство. С таким подходом можно как угодно менять иерархию внутри view этого контроллера, а для клиентского кода эти изменения пройдут незамеченными.

Это хвост из Obj-C, по видимому. Там возможно переопределить тип в заголовочном файле таким же способов. Так как objective-c использует селекторы настоящий класс не важен, важно лишь чтобы класс отзывался на нужные.

только так, как в статье в последнем параграфе тоже не делают, а используют dynamic

@dynamic нужен только для того, чтобы сказать компилятору, что не нужно генерировать getter/setter. Вы можете изменить свойство у существующего поля. Помнится, я так с datasource делал, так как потомку от класса нужны были дополнительные данные.

Впрочем, в случае с кастомными контроллерами, я бы поступал по аналогии с системными классами — для единообразия.
Правильно, это как раз тот случай, когда ничего не надо генерировать, т.к. UIViewController уже всё что надо сгенерировал.
> не видел property типа UITableView *view
К слову, раньше view и tableView возвращали один и тот же объект. На данный момент не знаю, не перепроверял.
Это лишь частный случай. А в UICollectionViewController уже не так.
На самом деле, MVC так и задумывался. В оригинале модели еще и активные были, а не просто структуры данных.
В принципе вынесение UI в UIView и кода по его обработке аналогично реализации фрагментов в Android и применяется в тех же случаях и целях. Я подобный подход использую уже несколько лет. Только верстку я делаю на xib именно отдельного UIView, а не UIViewController. В случае, когда нужно менять в одном и том же контроллере разные виды, это более корректно.
Sign up to leave a comment.