2011-06-13 10 views
6

Mam podklasę UIViewController i staram się dowiedzieć, co przesłonić tak, że mogę uruchomić kod inicjalizacji tylko raz na wystąpienie obiektu.Gdzie zainicjować coś RAZ w UIViewController

Metoda może wydawać się oczywistą odpowiedzią, ale problem polega na tym, że viewDidLoad może działać więcej niż jeden raz, jeśli kontroler zresetuje widok z powodu ostrzeżenia o pamięci. Metody wydają się również dobrym wyborem, ale które z nich należy zastąpić? Metoda awakeFromNib jest kolejną kwestią, ale wydaje się, że nie jest ona wykonywana w moim kontrolerze widoku.

Czy istnieje sposób, aby to zrobić, że brakuje mi?

Odpowiedz

4

Prawdopodobnie możesz nadal używać viewDidLoad, ale w środku użyj statycznej wartości boolowskiej, aby sprawdzić, czy już tam byłeś.

static BOOL didInitialize = NO; 
if (didInitialize == YES) 
    return; 

didInitialize = YES; 
/* initialize my stuff */ 
+0

Myślę, że moje pytanie nie było jasne. Miałem na myśli moje instancje obiektów, ale przypuszczam, że to samo podejście mogłoby być użyte ze zmienną obiektową. – chris

2

Co z numerem +(void)initialize? To inicjator klasy, który iOS woła do ciebie, raz, dla klasy, tak jak ją rozumiem.

+0

Pamiętaj, aby sprawdzić 'if (self == [klasa MyViewController])'. –

+0

Czy inicjalizacja + (void) zostanie wywołana, gdy obiekt zostanie rozpakowany ze stalówki? Jeśli nie, wymagana inicjalizacja może nie nastąpić prawidłowo. –

+0

Jeśli ładuje się ze stalówki, możesz zaimplementować '- (void) awakeFromNib', aby wykonać jednorazowe ustawienia dla zrekonstruowanego obiektu. Ale to nie jest inicjalizacja klasy; jest to przypadek obiektu pojedynczego obiektu jednorazowego. Różne. –

5

UIViewControllers męska wyznaczony inicjator, sposób, że wszystkie inne inicjalizatory mają się połączyć, jest -initWithNibName:bundle:. Jeśli chcesz zainicjować coś podczas tworzenia kontrolera widoku, zastąp tę metodę.

-viewDidLoad jest przeznaczona do każdej konfiguracji, która zależy od widoków kontrolera. Jak zauważysz, ta metoda może działać więcej niż jeden raz, ponieważ widoki mogą być ładowane więcej niż jeden raz. -awakeFromNib nie pomoże, chyba że kontroler widoku sam istnieje w końcówce, a nawet wtedy ma sens tylko wtedy, gdy inicjowany obiekt zależy od innych obiektów w tej samej końcówce.

+0

Jeśli się nie mylę, '-initWithFrame:' ​​nie jest metodą UIViewController, więc myślę, że to nie zadziała. Być może chodziło Ci o 'initWithNibName: bundle:'? – chris

+0

Doh. Masz rację, oczywiście ... Myślałem o UIView, a nie UIViewController. Naprawię ten post. – Caleb

+0

Ta odpowiedź jest poprawna. Tylko jedna metoda init powinna uruchamiać twój kod inicjujący, a inne metody init powinny wywoływać tę metodę init. –

Powiązane problemy