2011-11-07 17 views
19

Od pewnego czasu debatuję nad tym, mam nadzieję, że możesz mi pomóc.Jak ustawić delegata za pomocą storyboardu

Stworzyłem aplikację, używając głównie scenorysów, mam punkt, w którym wyskakuję okno modalne, aby dodać nowy rekord, wyskakujące okienko działa poprawnie, problem znika.

Postępowałem zgodnie z instrukcjami Apple dotyczącymi prawidłowego zamykania modalnych skrzynek za pomocą delegatów, co działa dobrze, z tym, że muszę dodać kontroler nawigacyjny do mojego modalnego modułu, ponieważ proces dodawania wymaga dwóch kroków (tutaj fullscreen):

enter image description here

problem polega na ustawieniu delegata, więc tutaj są moje dwa pytania:

1- moim zdaniem główny klasy (My Tab) jest delegatem klasy add (modalna) wszystko jest ustawione poza tym wyjątkiem:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 
     [[segue destinationViewController] setDelegate:self]; 

    } 
} 

Problem polega na tym, że [segue destinationViewController] zwraca element navigationcontroller, a nie klasę AddDrinkViewController (zobacz scenorys). Jak sobie z tym poradzić? Jeśli całkowicie usunę kontroler nawigacji, kod działa poprawnie, ustawiając odpowiedniego uczestnika.

2- Czy istnieje sposób ustawienia delegata poprzez przeciągnięcie gniazd w scenorysie?

Dzięki!

+0

Szukałem wszędzie, jak ustawić delegata modalu. Wielkie dzięki za ten kod. Haha – MattAitchison

Odpowiedz

13

Masz rację, będzie w tym przypadku UINavigationController. Pisałem kategorię, aby obsłużyć tę wspólną sytuację:

// category .h file 
@interface UIStoryboardSegue (NavControllerExtensions) 
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead. 
@property (readonly) id topLevelDestinationViewController; 
@end 

// category .m file 
@implementation UIStoryboardSegue (NavControllerExtensions) 
- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* nav = dest; 
    dest = nav.topViewController; 
    } 
    return dest; 
} 
@end 

Więc teraz można po prostu zrobić to w żadnej z metod prepareForSegue, i nie trzeba się martwić o to, czy istnieje jeszcze istnieje NavigationController:

[[segue topLevelDestinationViewController] setDelegate:self] 
// another example: 
MyViewController *vc = segue.topLevelDestinationViewController; 
vc.delegate = self; // etc. 

Aby odpowiedzieć na twoje drugie pytanie, nie mogłem znaleźć sposobu na ustawienie delegata w IB.

9

znalazłem krótszą drogę w moim przypadku (takie same):

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 
+1

Nice! Rozwiązałem mój problem jak urok! – iDroid

+0

Idealny, rozwiązał również mój problem. Nie mogłem zrozumieć, dlaczego mogłem odwołać się do właściwości innych kontrolerów viewController, które używają tego samego kontrolera nav, ale nie tych, które używają innego. Uff! –

+0

Nice. To mi się udało. Inteligentne rozwiązanie. –

4

Zasadniczo należy utworzyć
wystąpienie UINavigationController i przypisać destinationViewController niej
i chwycić jego kontroler Topview

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 

    UINavigationController *navigationController = segue.destinationViewController; 
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController; 

    addDrinkcontroller.delegate = self; 

    } 
} 
Powiązane problemy