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

let cards = [{
    item: {
        _id: '5c863cc8ee0819f989acf9c3',
        imagePath: 'https://upload.wikimedia.org/wikipedia/en/5/5e/Gothiccover.png',
        title: 'Gothic Video',
        description: 'Absolutely stunning',
        price: 10,
        __v: 0,
    },
    image: 'https://upload.wikimedia.org/wikipedia/en/5/5e/Gothiccover.png',
    qty: 1,
    price: 10,
    id: '5c863cc8ee0819f989acf9c3',
}]

cards.forEach(element => {
    delete element.id
})

console.info(cards)
16
задан Monolo 4 March 2012 в 22:01
поделиться

4 ответа

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

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

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

11
ответ дан 30 November 2019 в 22:17
поделиться

Реализовать:

- (void) viewDidLoad

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

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

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

0
ответ дан 30 November 2019 в 22:17
поделиться

Внутренне,

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

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

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

.
7
ответ дан 30 November 2019 в 22:17
поделиться

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

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

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

2
ответ дан 30 November 2019 в 22:17
поделиться