Автоматически загружая XIB для UITableViewController

Столкнулся с чем-то интересным, хотят знать, делаю ли я что-то не так или если это - корректное поведение.

У меня есть пользовательский UITableViewController. Я ПРИНЯЛ (первая ошибка) это, если Вы инициализируете как таковой:

[[CustomTableController alloc] init];

это автоматически загрузилось бы от XIB того же имени, CustomTableController.xib, если это находится в том же каталоге и таком.

ОДНАКО

Это не работает; не загружает XIB. НО, если я изменяю родительский класс своего контроллера от 'UITableViewController' до 'UIViewController', EVERYHTING ХОРОШО РАБОТАЕТ!

Вызов:

[[CustomTableController alloc] init];

загружает контроллер и представление от моего xib.

Я делаю что-то не так? Действительно ли это - ошибка? Ожидаемое поведение?

5
задан ACBurk 7 April 2010 в 22:21
поделиться

1 ответ

Большинство классов в Cocoa Touch содержат список "назначенного инициализатора", который вы должны вызывать из методов init при создании их подклассов. Когда вы создаете свой собственный пользовательский класс, нелишним будет проверить документацию, чтобы найти назначенный инициализатор для вашего суперкласса. Когда вы инициализируете класс, используя какой-либо другой инициализатор из более общего суперкласса (что вы делаете, вызывая - [NSObject init] в данном случае), вы лишаете свой непосредственный суперкласс возможности правильно инициализировать свое состояние. Иногда это может сойти вам с рук. Часто нет. В документации

UIViewController говорится, что его назначенным инициализатором является -initWithNibName:bundle:. Если вы вызовете этот метод с nil nibName, он будет искать nib, соответствующий имени вашего класса. Поведение -init недокументировано для UIViewController. Исходя из поведения, которое вы видите, похоже, что он может вызывать [self initWithNibName:nil bundle:nil], но было бы безопаснее вызвать initWithNibName:bundle: напрямую, а не полагаться на это недокументированное поведение.

UITableViewController определяет только один инициализатор, -initWithStyle: (хотя он не указывает этот метод в качестве назначенного инициализатора). Этот метод инициализирует ваш UITableViewController без использования nib, что обычно нормально. Поскольку вы не добавляете в UITableView вложенные представления, обычно нет особой пользы от конфигурирования UITableViewController с помощью nib.

Если вы все же решили настроить UITableViewController через nib, документация говорит нам, что мы можем спокойно обойти -initWithStyle: и вызвать метод UIViewController initWithNibName:bundle:. Вот что говорит нам документация о том, как будут инициализированы наш UITableView и его контроллер в каждом случае:

  • Если nib-файл указан через метод initWithNibName:bundle: (который объявлен суперклассом UIViewController), UITableViewController загружает табличное представление, заархивированное в nib-файле. В противном случае он создает неконфигурированный объект UITableView с правильными размерами и маской авторазмера. Вы можете получить доступ к этому представлению через свойство tableView.

  • Если загружен nib-файл, содержащий представление таблицы, источником данных и делегатом становятся объекты, определенные в nib-файле (если таковые имеются). Если nib-файл не указан или если nib-файл не определяет источник данных или делегата, UITableViewController устанавливает источник данных и делегата табличного представления в self.

В целом, в документации к большинству классов Cocoa Touch указан либо единственный назначенный инициализатор, либо несколько инициализаторов, которые вы можете безопасно вызывать из своих подклассов. Всегда обращайтесь к документации для своего суперкласса, чтобы узнать, какой инициализатор должен вызывать ваш подкласс.

26
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: