Какой инициализатор (ы) переопределить для подкласса UITableViewController - PullRequest
16 голосов
/ 13 апреля 2009

У меня есть подкласс UITableViewController, который создается в зависимости от того, где он используется, в NIB или с помощью кода. В обоих случаях я хочу сделать настройку в методе инициализатора. Означает ли это, что мне нужно реализовать и initWithNibName:bundle: , и initWithCoder:, и будет ли каждый метод вызывать свой соответствующий супер инициализатор?

Хотя мне это сейчас не нужно, что, если я также хочу иметь возможность создавать экземпляр контроллера вида с помощью initWithStyle:? Тогда мне понадобятся 3 разных метода инициализации, которые повторяют одно и то же поведение?

Похоже, что это нарушает все обозначенное соглашение инициализатора, так как по существу будет 3 отдельных инициализатора, которые не в конечном итоге вызовут общий метод init. Или есть способ создать общий назначенный инициализатор, поддерживая 3 различных экземпляра маршрутов?

Ответы [ 5 ]

11 голосов
/ 16 апреля 2009

Моя путаница была основана на ошибочном убеждении, что у каждого класса должен быть один назначенный инициализатор. Это не так, и в случае UITableViewController есть 3 назначенных инициализатора (насколько я могу судить):

  1. initWithStyle: объявлено локально
  2. initWithNibName:bundle: унаследовано от UIViewController
  3. initWithCoder: с принятием NSCoding протокола

Вам необходимо переопределить 1 или более из них в вашем подклассе в зависимости от того, как создается ваш подкласс. В моем случае мне пришлось реализовать # 2 и # 3, поскольку класс может быть загружен из NIB или создан с помощью кода со ссылкой на NIB. (Я полагаю, что редко вы будете использовать initWithStyle: и initWithNibName:bundle: для одного класса.)

Я нашел полезными Apple Руководство по кодированию для какао .

7 голосов
/ 11 февраля 2010

Внутри

  • UITableViewController -initWithStyle: вызывает супер * -init, затем устанавливает _tableViewStyle ivar.
  • UIViewController -init просто вызывает -initWithNibName:bundle: с аргументами по умолчанию.
  • UITableViewController не переопределяет -initWithNibName:bundle:.

Поэтому, если вы переопределите -initWithNibName:bundle:, то -initWithStyle: также примет это изменение. Конечно, чтобы играть безопасно (поскольку вам не следует полагаться на детали реализации), переопределите их оба.

(И нет необходимости переопределять -initWithCoder:, если вы не будете удалять / архивировать экземпляры.)

2 голосов
/ 10 февраля 2010

Для пояснения, initWithStyle:, являясь единственным опубликованным инициализатором UITableViewController в документах, является его явно назначенным инициализатором.

initWithNibName:bundle: наследуется от UIViewController и является назначенным инициализатором для этого класса. Таким образом, в соответствии с руководящими принципами Какао UITableViewController должен переопределить этот метод (путем его реализации). Однако это не делает его назначенным инициализатором UITableViewController.

initWithCoder:, как вы указали, является неявным назначенным инициализатором из NSCoding.

0 голосов
/ 03 января 2012

Добавление к постам выше этой ссылки --initWithCoder:

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

(- initWithNibName вызывается только при программном создании контроллера представления.)

0 голосов
/ 13 апреля 2009

Реализация:

- (void) viewDidLoad

и выполните инициализацию вашего компонента там.

Преимущество состоит в том, что инициализация выполняется только тогда, когда представление действительно запрашивается.

Или просто создайте отдельный метод настройки, вызываемый всеми инициализаторами.

...