2013-04-05 10 views
6

Eksperymentuję na temat ładowania plików końcówek do pliku UIViewController.Ładowanie pliku końcówki wewnątrz obiektu UIViewController

Utworzono oddzielny plik końcówki o nazwie e-mail. Najpierw zauważyłem, że po załadowaniu kontrolera widoku, metoda initWithNibName nie jest wywoływana. Więc zadzwoniłem go z metody ręcznego jak ta viewDidLoad,

[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]]; 

To nie działa. Otrzymałem również ostrzeżenie z informacją, że wynik wyrażenia nie został użyty.

I Szukałem w internecie i natknąłem this artykułu i wdrożył metodę loadView jak opisano jak tak,

- (void)loadView 
{ 
    [super loadView]; 

    UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil]; 
    [nib instantiateWithOwner:self options:nil]; 
} 

Metoda jest wywoływana ale nadal kontroler widoku jest pusty!

Czy ktoś może mi powiedzieć, co tu widzę i jak można to zrobić?

Dziękuję.

UPDATE:

Po pierwsze, dzięki za wszystkie odpowiedzi. Jednak odpowiedzi voromax i svena sugerują, że powinienem automatycznie usunąć segue i załadować końcówki, których nie lubię. Odpowiedź Anila działa, a teraz mam ostatnią przeszkodę, by skakać.

Mam wiele plików końcówek. W zależności od wyboru użytkownika powinien on załadować określoną stalówkę. Więc co starałem się umieścić wszystkie śruty wewnątrz tablicy jak tak,

- (void)loadView 
{ 
    [super loadView]; 

    NSArray *nibs = [[NSArray alloc] initWithObjects: 
        [[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil], 
        [[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil], 
        [[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil], 
        [[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil], nil]; 


    self.view = [nibs objectAtIndex:0]; 
} 

i do niego dostęp za pomocą swojego indeksu jak ten self.view = [nibs objectAtIndex:1];. Ale generuje błąd * Kończenie aplikacji z powodu nieprzechwyconego wyjątku "NSInvalidArgumentException", powód: "- [__ NSArrayM _setViewDelegate:]: nierozpoznany selektor wysłany do instancji 0xd56fd20 '*

Dlaczego ten błąd nadchodzi? Jeśli nie jest to możliwe, jestem otwarty na sugestie.

Jeszcze raz dziękuję. I przepraszam za trochę przeciągania tego.

+0

Nadal nie wspominając o storyboardy i niestandardowe logiki w swoim pytaniu, nie wszyscy będą czytać wszystkie komentarze ... Zobacz zaktualizowaną odpowiedź – voromax

Odpowiedz

1

Nie należy ładować końcówki dla kontrolera widoku z poziomu metod tego kontrolera widoku.

Jeśli chcesz utworzyć instancję kontrolera widoku z końcówki, robisz to spoza tego kontrolera widoku, zwykle kontrolera widoku, który go wyświetla.

Jeśli szukasz haczyka w przedstawionym kontrolerze widoku, który już ma skonfigurowane połączenia wyjściowe, popularniejszy jest nadpisanie -awakeFromNib. -viewDidLoad to kolejny.

Aktualizacja # 1

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{ 
    if (/*do your segue identification stuff*/) { 
     UIViewController *myViewController = /*init your view controller here*/ 
     UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
     [self presentViewController:navigationController animated:YES completion:nil]; 
     return NO; 
    } 
    return YES; 
} 
+0

Istnieje 'UITableViewController' jako poprzedni kontroler widoku, więc próbowałem załadować stalówkę podczas tworzenia instancji tuż przed rozpoczęciem procesu przełączania. 'NewMailViewController * newMailVC = [[NewMailViewController alloc] initWithNibName: @" Email "bundle: nil]; newMailVC = [segue destinationViewController]; 'Ale to nie zadziałało. – Isuru

+1

Z twojego komentarza wnioskuję, że używasz storyboardów. Storyboardy tworzą twoje kontrolery widoku i nie ładujesz ich samodzielnie. Czy jest jakiś powód, dla którego chciałbyś wrócić do ładowania od stalówki z używania storyboardu? – svena

+0

Tak, używam Storyboards. Przepraszam, że powinienem był o tym wspomnieć w pytaniu. Scenariusz jest taki. Tworzę niestandardową aplikację pocztową i istnieje wiele typów wiadomości. Dla każdego typu poczty interfejs użytkownika jest inny. Zrobiłem więc osobną stalówkę dla każdego typu poczty, mam "UITableViewController", aby wyświetlić listę typów maili i kiedy to zależy, w zależności od wyboru użytkownika, ładuje określony plik nib do "UIViewController". – Isuru

1

Należy użyć pliku nib instancji kontrolera sam widok i. mi.

UIViewController *ctrl = [[UIViewController alloc] initWithNibName:@"Email" bundle:nil]; 

Po tym można przedstawić ten kontroler

Aktualizacja

W przypadku, gdy trzeba wybrać, który obejrzeć kontroler powinien być ładowany przez logikę aplikacji lepiej jest utworzyć wszystkie kontrolery widoku w jednym scenopisie pomiń twarde powiązanie segue i użyj metodyinstancji storyboardu, aby uzyskać odpowiedni kontroler widoku i przedstawić go ręcznie. Zakładam, że Twój stół widok kontroler jest już kontrolerem nawigacyjnym:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    if (APPROPRIATE_INDEX_PATH) { 
     UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER]; 
     [self.navigationController pushViewController:ctrl animated:YES]; 
    } 
} 
+0

Istnieje 'UITableViewController' jako poprzedni kontroler widoku, więc próbowałem załadować nib, gdy utworzyłem instancję tuż przed zdarzeniem segue. 'NewMailViewController * newMailVC = [[NewMailViewController alloc] initWithNibName: @" Email "bundle: nil]; newMailVC = [segue destinationViewController]; 'Ale to nie zadziałało. – Isuru

+1

Możesz anulować ten segue przez '- shouldPerformSegueSegIdentifier: sender:' return NO i załaduj swój kontroler ręcznie – voromax

9

Użyj poniższego kodu, aby załadować widok z stalówką i używać jako widok kontrolera widoku za

- (void)loadView 
{ 
[super loadView]; 

NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil]; 
self.view = [nib objectAtIndex:0]; 
} 

Edycja

Załaduj pojedyncze pióro zgodnie z wyborem użytkownika. Zobacz ładowanie pojedynczej końcówki. Zwraca tablicę obiektów. Z Twojego zaktualizowanego pytania widzę, że przechowujesz te tablice w innej tablicy. Teraz twoja tablica nib jest tablicą "tablicowych" obiektów.

self.view = [[nibs objectAtIndex:0]objectAtIndex:0]; 

będzie działać.

Ale to nie jest dobry, należy załadować pojedynczy stalówka według choise użytkownika

+0

Dzięki za odpowiedź. Ta metoda działa i mam pytanie poboczne. Mam wiele plików końcówek. W zależności od wyboru użytkownika powinien on załadować określoną stalówkę. Więc próbowałem, umieścić wszystkie stalówki wewnątrz tablicy, jak [this] (http://pastebin.com/rcpHTTSY) i uzyskać do niego dostęp za pomocą indeksu liek tego 'self.view = [nibs objectAtIndex: 1];'. Ale zgłasza błąd _Terminowanie aplikacji z powodu niezamkniętego wyjątku "NSInvalidArgumentException", powód: '- [__ NSArrayM _setViewDelegate:]: nierozpoznany selektor wysłany do instancji 0xd56fd20'_ Czy brakuje mi czegoś lub czy jest inny sposób na obejście tego? – Isuru

+0

Czy możesz zamieścić swój kod wraz z pytaniem? Nie mogę uzyskać dostępu do tej strony. W rzeczywistości tablica nib zwraca przez __loadNib__ zawiera nie tylko widok s, zawiera wszystkie kontrolki w twoim końcu (buttons/label ..) objectAtIndex [0] będzie obiektem najwyższego poziomu (najprawdopodobniej widokiem jeśli masz pojedynczy widok na stalówka). Nie widząc twojego kodu, nie mogę powiedzieć dokładnego problemu. –

+0

Zaktualizowałem moje pytanie powyżej. – Isuru

Powiązane problemy