Какой инициализатор(ы) переопределить для подкласса UITableViewController

StackOverflow https://stackoverflow.com/questions/743010

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Внутренне,

  • UITableViewController's -initWithStyle: звонит супервайзеру -init затем установите _tableViewStyle ивар.
  • UIViewController -init просто звонит -initWithNibName:bundle: с аргументами по умолчанию.
  • УИТаблевиевконтроллер не переопределить -initWithNibName:bundle:.

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

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

Чтобы уточнить, initWithStyle:, существование UITableViewControllerЕдинственный опубликованный инициализатор в документации - это его единственный явно назначенный инициализатор.

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

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

Осуществлять:

- (void) viewDidLoad

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

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

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

Дополнение к сообщениям выше, посвященным ссылке –initWithCoder:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top