2016-04-20 2 views
0

Я узнал очень болезненный урок о том, как обеспечить, чтобы ваши розетки были ноль на viewDidLoad контроллера представления, и это путем написания собственного метода initWith ....Как написать initWith ... на viewController

-(id)initWithDoohickey:(SomeDoohickey*)doohickey 
    { 
     self = [super init]; 
     if (self) 
     { 
      theDoohickey = doohickey; 
     } 
     return nil; 
    } 

Теперь, когда вы вызываете этот метод, вместо initWithNibName, или просто инициализации, ваш взгляд точек будет ноль, и вы будете работать во все виды отладки кошмаров.

Так я вижу два решения здесь ... (1) Вызов инициализации или initWithNibName и дайте ему делать это дело, и следует, что с classInQuestion configureWithDoohickey:(SomeDoohickey*)doohickey

или (2) выяснить, как правильно написать initWith ..., который на самом деле загружает nib должным образом, а также позволяет мне передавать любые переменные конфигурации, которые я хочу в одном и том же вызове.

Я хотел бы знать, как это сделать (2).

+6

Вызов '[super initWithNibName ...]' вместо '[super init]'. – rmaddy

+0

Можете ли вы опубликовать это в качестве ответа, чтобы я мог дать вам кредит в качестве ответа? –

+1

Хорошая причина переключиться на Swift. Это не позволило бы вам совершить эту ошибку. – matt

ответ

2

Просто позвоните по номеру [super init]; по телефону [super initWithNibName:...];.

Очевидно, что вам необходимо передать правильные аргументы.

+0

Вы должны объяснить, почему это так. (Подсказка: «d ... i ....».) – matt

+2

@matt OP необходимо вызвать 'initWithNibName ...', потому что они используют контроллер представления на основе nib. Это не имеет никакого отношения к назначенным инициализаторам. Я не использую IB, поэтому я никогда не использую 'initWithNibName', и все мои контроллеры представлений работают очень хорошо. – rmaddy

+0

@rmaddy. Правило заключается в том, что в пользовательском методе init вы должны вызвать назначенный инициализатор. (initWithNibName: в этом случае). Если вы не используете IB, то тот факт, что вы не вызываете назначенный инициализатор, не наносит никакого вреда, но это по-прежнему правильно. Если вы публикуете контроллер просмотра для других, чтобы потреблять, скажем, и ОНИ, используйте его из наконечника, тот факт, что вы не вызываете назначенный инициализатор, скорее всего вызовет проблемы. –

0

Проблема у вас в том, что вы не правильно chain the initializers. Процесс инициализации подкласса должен (в конечном счете) вызвать его суперкласса designated initializer. Назначенный инициализатор гарантирует, что все данные данных класса правильно настроены.

Если вы не вызываете DI DI суперкласса, он не может установить свойства, которые были определены в суперклассе.

Простой init, который вы используете, не является назначенным знаменем UIViewController; initWithNibName:bundle: есть. Как сказал rmaddy: , что - это метод, который вы должны использовать в собственном назначенном для вас интерфейсе вашего подкласса.

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

(Кстати, эти отношения были официально оформлены в Swift. Initializer сцепления фактически является частью языка, а не только конвенции. Это can be confusing, но интересно, как вы писали initWithDoohickey: бы даже не компилируется в Swift .)

Смежные вопросы