2011-06-22 13 views
12

Chciałbym zrozumieć, dlaczego jeśli próbuję ustawić wartość (np. SetAlphaValue lub setTitle) dla obiektu (np. NSButton) w metodzie init nic się nie dzieje, ale jeśli wywołasz funkcję ustawiającą w awakeFromNib, działa poprawnie.init and 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

jest twoim przyciskiem i IBOutlet? – Eimantas

Odpowiedz

37

wyloty są ustawione po-init i przed-awakeFromNib. Jeśli chcesz uzyskać dostęp do gniazdek, musisz to zrobić w -awakeFromNib lub innej metodzie, która jest wykonywana po ustawieniu gniazdek (np. -[NSWindowController windowDidLoad]).

Gdy plik zostanie załadowany stalówka:

  1. Obiekty w pliku nib są przydzielane/zainicjowany, odbierania albo -init, -initWithFrame: lub -initWithCoder:
  2. Wszystkie połączenia są przywracane. Obejmuje to działania, punkty sprzedaży i powiązania.
  3. -awakeFromNib jest wysyłany do obiektów interfejsu, właściciela pliku i obiektów proxy.

Możesz przeczytać więcej o procesie ładowania końcówki w Resource Programming Guide.

+1

+1 za bycie szybszym i dłuższym. :) – Eiko

+0

Dziękujemy! idealna odpowiedź (potrzebuję poczekać kilka minut, aby ją zaakceptować :)) – MatterGoal

+3

Chciałbym dodać: "Kolejność, w której kod ładujący nib wywołuje metody obiektu awakeFromNib, nie jest gwarantowany." W OS X, Cocoa próbuje wywołaj metodę awakeFromNib właściciela pliku, ale nie gwarantuje tego zachowania.Jeśli musisz skonfigurować obiekty w pliku nib w czasie ładowania, najbardziej odpowiedni czas to zrobić po powrocie połączenia nib. , wszystkie obiekty są tworzone, inicjalizowane i gotowe do użycia. " z Przewodnika programowania zasobów w tej odpowiedzi. –

5

Podczas inicjowania widok nie zostanie poprawnie skonfigurowany, a wyjścia nie zostaną podłączone. Dlatego w tym przypadku używasz awakeFromNib: - wszystko jest skonfigurowane i gotowe do użycia.