2012-03-18 13 views
50

Mam problemy z przesłonięciem metody inicjalizacji dla mojego CustomViewController, który został zaprojektowany w mojej Storyboard.Metoda init niestandardowego viewController z storyboardem

teraz robię (w moim mainViewController):

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

i mam w viewDidLoad (CustomViewController)

[self.label setText:self.myObject.someString]; 

To działa OK.

Ale czy to jest właściwy sposób? Czy powinienem dodać niestandardową metodę init (lub przesłonięcie) do mojego kontrolera CustomViewController? Podobnie jak initWithObject:? Nie wiem, jak nazwać moją niestandardową metodę init zamiast UIStoryboard instantiateViewControllerWithIdentifier:, a ja nie otrzymuję połączeń z init ani initWithNibName.

Może powinienem użyć: - (id)initWithCoder:(NSCoder *)decoder.

Proszę, udziel mi rady!

Dziękujemy!

+0

robisz wszystko w porządku. możesz przesłonić initWithCoder w swojej klasie niestandardowej, np. plik klasy twojego obiektu _customViewController dla zrobienia niestandardowego init –

Odpowiedz

58

Wyznaczonym inicjatorem dla kontrolerów widoku w scenorysach jest -initWithCoder:. Ponieważ większość kontrolerów widoku z storyboardu jest tworzona za pośrednictwem segues, zwykle widzisz stan ustawiony podczas -prepareForSegue:sender:.

Jeśli tworzysz kontroler widoku bezpośrednio z serii ujęć, tak jak w podanym przykładzie, to wybrany wzór jest odpowiedni.

+0

Wspaniale wiedzieć, że robię rzeczy, jak się wydaje! –

+2

To jest całkiem kiepski projekt, ponieważ sprawia, że ​​korzystasz z opcji w trybie szybkim (z!?) Lub uzyskuj dostęp do możliwych zer, jeśli programista zapomni ustawić poprawną zmienną. To smutne, że jest to "odpowiednie" rozwiązanie: dobre źródło tego problemu z szybkim/obiektywnym c opcjonalnie: http://www.objc.io/issue-16/power-of-swift.html –

+0

Po prostu odpowiedzieć do komentarza @GuilhermeSilveira, to pytanie pochodzi z 2012 roku, kiedy szybka nie była jeszcze publicznie znana, a nawet jeśli tak było, wzorce projektowe różnią się znacznie między Objective-C i Swift, więc nie powinieneś trzymać się tego wzorca, jeśli rozwijasz się z Szybki. –

0

Jako kolejne "obejście" tego problemu można użyć delegowania. Utwórz protokół, który będzie działał jako źródło danych dla Twojej podklasy UIViewController z storyboardu. Zgodne z tym protokołem źródła danych, wdrożyć go i używać go tuż po załadowaniu swoją podklasę UIViewController:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

wiem ... Ja też nie lubię tego, ale ...;)

Powiązane problemy