2009-10-19 13 views
12

Zaczynam przenosić większą część mojej konstrukcji hierarchii widoków do IB.Dlaczego nie budzi się mój przebudzony FromNib?

Mam plik końcówki o nazwie "AlignmentViewController.xib", w którym ustawiłem hierarchię widoku z AlignmentViewController jako właścicielem plików. To działa dobrze.

Jedną z metod, na których pozostaję niewyraźny, jest awakeFromNib. W poniższym fragmencie kodu narzędzia AlignmentViewController dodaję jedną dodatkową metodę awakeFromNib. Jednak to nie dostaje nazywa:

- (void)awakeFromNib { 

    NSLog(@"AlignmentViewController - awakeFromNib"); 
    [super awakeFromNib]; 

} 

- (id)initWithChromosomeName:(NSString *)chromosomeName 
       basepairStart:(NSUInteger)basepairStart 
       basepairEnd:(NSUInteger)basepairEnd { 

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil]; 

    if (nil != self) { 


     self.title   = @"Alignment"; 

     self.chromosomeName = chromosomeName; 
     self.basepairStart = basepairStart; 
     self.basepairEnd = basepairEnd; 

     self.wantsFullScreenLayout = YES; 

    } 

    return self; 
} 

Czy ktoś może wyjaśnić mi, co mam tutaj brakowało?

Cheers, Doug

UPDATE: Po przeczytaniu niektórych z odpowiedzi Zdaję sobie sprawę, muszę dostać się do dolnej części czegoś, co jest dość podstawowe.

Patrząc na inicjalizacji:

- (id)initWithChromosomeName:(NSString *)chromosomeName 
       basepairStart:(NSUInteger)basepairStart 
       basepairEnd:(NSUInteger)basepairEnd { 

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil]; 

zauważam Wołam initWithNibName: bundle: pośrednio. Czy to zła praktyka? Plik AlignmentViewController.xib definiuje moją hierarchię widoku. Ale tak naprawdę nie używam initWithNibName: bundle: w typowy sposób? Czy jest lepszy sposób to zrobić?

+2

FWIW, UIViewController dostarcza również 'viewDidLoad' specjalnie dla jakiegokolwiek przetwarzania trzeba zrobić w kontrolerze, po pogląd został załadowany (zarówno ręcznie lub ze stalówką). –

+0

Tak. Korzystam w szerokim zakresie z viewDidLoad. Po prostu próbuję przenieść większą konstrukcję interfejsu do IB i muszę w pewnym momencie zająć się awakeFromNib. – dugla

+3

Używanie IB nie wymaga używania 'awakeFromNib', ani nie jest sprzeczne z użyciem' viewDidLoad'. –

Odpowiedz

30

-awakeFromNib jest wysyłany do wszystkich obiektów, które są tworzone z stalówki po utworzeniu wszystkich obiektów piły. Właściciel nie jest jednym z tych obiektów. Istnieje przed deserializacją stalówki i jest podłączony do stalówki po załadowaniu, więc nie jest wysyłany -awakeFromNib (o ile oczywiście nie jest on tworzony przez inne jądro).

Jedna wskazówka tutaj jest to, że nie ma możliwości zarówno wywołania -initFromChromosomePair:basepairStart:basepairEnd: i -awakeFromNib. Program ładujący końcówek zawsze wywołuje -initWithCoder:, -initWithFrame: lub -init (reguły, które zostały wysłane, znajdują się w The Nib Object Life Cycle). Fakt, że masz inny wyznaczony inicjator, zdecydowanie sugeruje, że ręcznie tworzyłeś ten obiekt gdzieś w kodzie, co oznacza, że ​​ten obiekt nie jest "przebudzony ze stalówki".

+0

Dzięki Rob, myślę, że jestem niejasny na semantykę initWithNibName: bundle :. Gdzie indziej w moim kodzie rzeczywiście nazywam initWithChromosomeName: basepairStart: basepairEnd: która z kolei wywołuje initWithNibName: bundle: jak pokazano powyżej. Czy w wyniku użycia initWithNibName nie uruchamiają się żadne metody związane z jądrem: bundle :? – dugla

+3

Wiele ognia; po prostu atakują obiekty tworzone przez program ładujący nib. Właściciel stalówki nie jest * w * stalówce, więc nie otrzymuje polecenia -awakeFromNib. -viewDidLoad zostaje wysłany do kontrolera widoku, w którym należy wykonać czynności, które należy wykonać po zakończeniu ładowania. Zauważ, że kontroler podglądu może znajdować się w końcówce, więc może odbierać zarówno -awakeFromNib (gdy jest ładowany ze stalówki nadrzędnej), jak i później - viewDidLoad (gdy kończy się ładowanie jego własnej końcówki). -awakeFromNib jest wysyłany do wszystkich obiektów w stalówce po utworzeniu wszystkich obiektów w stalówce i podłączeniu IBOutlet. –

+0

Teraz to rozumiem. Dzięki Rob, to naprawdę oczyszcza sprawy. Przeoczyłem fakt, że filesOwner jest tylko proxy, a nie członkiem stalówki. Chłód. Dzięki milionowi Rob. – dugla

2

Na podstawie tego, co nam powiedziałeś, wierzę, że wiem, jaki masz problem. awakeFromNib jest wywoływany, gdy obiekt jest deserializowany z pliku nib. Tutaj masz obiekt, który jest właścicielem, który istnieje przed nib jest załadowany. Tak więc awakeFromNib nigdy nie zostanie wysłany do twojego AlignmentViewController.h.

Jeśli chcesz coś tu zrobić, spróbuj zamiast tego użyć loadView. Lub po prostu zrób to po załadowaniu stalówki. Co chcesz zrobić, gdy chcesz to zrobić w awakeFromNib?

+0

Dzięki Gordon. Po prostu staram się uzyskać lepszą obserwację wokół semantyki i czasu związanego z kodem nib. Jestem w trakcie polegania coraz bardziej na IB dla konstrukcji interfejsu i wciąż nie jestem pewien, jak synchronizować świat IB i świat XCode. Tak więc, nie stosuję metod związanych z jądrem do korzystania z initWithNibName: bundle :? – dugla

+0

Nie, to, że 'awakeFromNib' nie jest wywoływany na twoim kontrolerze, ponieważ twój kontroler nie znajduje się w stalówce. Będzie on wywoływany na wszystkich widokach i takich, które znajdują się w stalówce. –

+1

Należy zauważyć, że powyżej, gdzie Gordon mówi "loadView", uważam, że ma na myśli "viewDidLoad". Generalnie nie powinieneś mieszać z -loadView podczas pracy z kontrolerami widoku opartymi na nib. –

32

Po prostu dodanie wyjaśnienia: -awakeFromNib jest wysyłany do właściciela pliku w kakao, ale nie do kakao Touch.

From Apple's Docs:

...

  • Wysyła wiadomość awakeFromNib do odpowiednich obiektów w pliku nib definiujących selektor Dopasowanie:
    • W systemie Mac OS X, to wiadomość jest wysyłana do wszystkich obiektów interfejsu, które definiują metody. Jest również wysyłany do Właściciela pliku i dowolnych obiektów proxy, które go definiują.
    • W systemie iPhone OS ten komunikat jest wysyłany tylko do obiektów interfejsu, które zostały utworzone przez kod ładowania nib. Nie jest wysyłany do właściciela pliku, pierwszego obiektu odpowiadającego ani żadnych innych obiektów proxy.
Powiązane problemy