2011-06-22 2 views
12

Я хотел бы понять, почему, если я пытаюсь установить значение (I.e. setAlphaValue или setTitle) для объекта (например, NSButton) в методе init, ничего не происходит, но если я вызываю функцию setter в awakeFromNib, он работает правильно.init и awakeFromNib

@interface appController : NSObject { 
    NSButton *btn; 
} 
@end; 

@implementation appController 
-(void)awakeFromNib { 
    //it works 
    [btn setTitle:@"My title"]; 
} 

-(id)init { 
    self = [super init]; 
    if(self){ 
     //it doesn't works 
     [btn setTitle:@"My title"]; 
    } 
} 
@end 
+0

Ваша кнопка IBOutlet? – Eimantas

ответ

37

Розетки установлены после-init и перед тем-awakeFromNib. Если вы хотите получить доступ к выходам, вам необходимо сделать это в -awakeFromNib или другом методе, который выполняется после того, как выходы установлены (например, -[NSWindowController windowDidLoad]).

Когда перо файл загружен:

  1. объекты в файле бобах выделяются/инициализируется, получая либо -init, -initWithFrame: или -initWithCoder:
  2. Все соединения восстанавливаются. Сюда входят действия, выходы и привязки.
  3. -awakeFromNib отправляется объектам интерфейса, владельцу файла и прокси-объектам.

Подробнее о процессе загрузки nib можно узнать в Resource Programming Guide.

+1

+1 для того, чтобы быть быстрее и длиннее. :) – Eiko

+0

Спасибо! Идеальный ответ (мне нужно подождать еще несколько минут, чтобы принять его :)) – MatterGoal

+3

Я бы хотел добавить: «Порядок, в котором код загрузки nib-кода вызывает методы awakeFromNib объектов, не гарантируется. В OS X Cocoa пытается вызовите метод awakeFromNib владельца файла последним, но не гарантируйте его. Если вам нужно настроить объекты в файле nib дальше во время загрузки, самое подходящее время для этого - после того, как ваш запрос на загрузку nib будет возвращен. , все объекты создаются, инициализируются и готовы к использованию ». из Руководства по программированию ресурсов в этом ответе. –

5

Если в режиме инициализации изображение не будет настроено правильно, а розетки не будут подключены. Вот почему вы используете awakeFromNib: в этом случае - все настроено и готово к использованию.

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