2012-04-05 3 views
8

У меня есть подкласс NSViewController, который загружает его представление из nib (с initWithNibName: bundle: и является владельцем файла этого nib).Лучший способ настроить NSViewController, инициализированный initWithNibName: bundle :?

мне нужно сделать некоторые инициализации после загрузки СИБ и я хочу, чтобы мой код, чтобы быть наиболее совместимым:

  • в ИО: Существует метод viewDidLoad сделать что
  • В OSX: В снежный барс, нет никакого способа, как viewDidLoad но awakeFromNib не вызывается на владельца файла СИБ слишком

Так что мои вопросы:

  1. Is awakeFromNib вызывается также у владельца файла в Lion?
  2. Если я использую awakeFromNib, мне нужно позвонить [super awakeFromNib]? (NSViewController реализует awakeFromNib?)
  3. Если ответ 1 есть ДА, это хорошее решение? :
- (void)initAfterNibLoaded { 
    ... 
} 

- (void)viewDidLoad { 
    // Code for ios 
    [self initAfterNibLoaded]; 
} 

- (void)awakeFromNib { 
    // Code for osx 

    // Not sure if necessary 
    [super awakeFromNib]; 

    [self initAfterNibLoaded]; 
} 

Если ответ 1 НЕТ, это хорошее решение? :

- (void)viewDidLoad { 
    // Initialize after nib loaded 
} 

#ifndef TARGET_OS_IPHONE 
- (void)loadView { 
    // Call parent method 
    [super loadView]; 

    // Simulate viewDidLoad method 
    [self viewDidLoad]; 
} 
#endif 

Спасибо

+0

Поскольку NSViewController отсутствует в UIKit, я не уверен, почему вы обобщаете все платформы. –

+0

Да, но я хочу сделать меньше модификаций в коде, если мне нужно поместить его в ios. Изменение родительского класса из NSViewController в UIViewController - это не большая проблема, но я предпочитаю избегать много ошибок, потому что некоторые методы вызывают в ios, а не в osx или наоборот. – Johnmph

+0

Ответ, очевидно, jQuery. –

ответ

4

Вот что я нашел:

  1. Да, awakeFromNib: называется также на владельца файла СИБ в Лионе (и, как правило, это то же самое для новый горный лев).

  2. Начиная с OSX 10.6, есть категория на NSObject, который добавляет awakeFromNib, так что это безопасно для вызова [super awakeFromNib] из любого подкласса. Для OSX до 10.6 мы можем использовать instancesRespondToSelector: чтобы знать, реализует ли родительский класс awakeFromNib, подкласс NSView или NSObject не должен звонить [super awakeFromNib].