Jak mogę przekazać wartość między NavigationController i ViewController za pomocą StoryBoard?

Mam problem,
Poniżej znajduje się mój StoryBoard,
pierwszy kontroler to TabBarController,
i jest powiązana z (ViewController).

Jak mogę przekazać wartość między NavigationController i ViewController za pomocą StoryBoard?
A to ViewController,
B is a NavigationController, a change page to B by modal segue
C jest ViewController, C zmieni się na inną stronę przez push więc potrzebuję NavigationController

OK, chcę przekazać wartość Z A do C,
teraz mogę przekazać wartość z A do B przez prepareForSegue,
Jednak, ponieważ B I C mają związek, ale nie segue,
Więc nie mogę przekazać wartości z B do C przez prepareForSegue!!!

Jak mogę przekazać wartość między NavigationController i ViewController za pomocą StoryBoard?

Author: Azure Chen, 2013-01-13

1 answers

Obraz storyboardu jest tutaj trochę mylący.

Kiedy seguracja do B, w rzeczywistości jesteś segueing do B/C combo, ponieważ Navcontrollery zawsze mają co najmniej jeden viewController w ich stosie(który jest ich topViewController i ich [viewControllers objectAtIndex:0]).

Więc masz związek bezpośrednio od A do C.]}

Jak uzyskasz dostęp do kontrolera zależy od tego, czy twój segue to modal Czy push . W Twoim przypadku jest to modalne, ale opiszę oba, abyś mógł widzisz różnicę.

W obu przypadkach, aby przekazać dane do C, musisz zadeklarować właściwość w jego pliku nagłówkowym

    @interface CviewController: UIViewContrller
    @property (assign) int dataFromA;
    @end

Push segue

W segue push, to w rzeczywistości C jest destinationViewController, a nie B. W rzeczywistości segue push jest regulowany przez B, który jest kontrolerem UINavigationController zarówno dla A, jak i C. kod za segue push ma postać
[self.navigationController pushViewController:otherViewController];

In aviewcontroller ' s preparedforsegue:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
        {
         CviewController* controller = segue.destinationViewController;
        [controller setDataFromA:self.data];
    }

Jest możliwe w storyboardzie, aby popchnąć linię segue pomiędzy dwoma kontrolerami ViewController, które nie Nie mają wspólny Kontroler UINavigationController. Jednak po uruchomieniu tego pojawi się błąd awarii:

'nie można znaleźć kontrolera nawigacyjnego dla segue 'pushC'. Push segues może być używany tylko wtedy, gdy kontroler źródłowy jest zarządzany przez instancję UINavigationController.'

Za każdym dobrym posunięciem stoi Kontroler nawigacyjny.

Modal segue

Kod ukryty za modalnym Segue jest metodą UIViewController
- (void)presentViewController:(UIViewController *)viewControllerToPresent

W modalnym segue do kombinacji NavController/ViewController, docelowy viewController jest tym, na co wskazuje linia segue. Jeśli wskazuje na viewController, to jest to segue.destinationController (a UINavigationController będzie ignorowany, co nie jest tym, czego tutaj chcesz); jeśli wskazuje na UINavigationController, jak w tym przypadku, to będzie to destinationController. Ale dostęp do kontrolera viewController jest nadal prosty, ponieważ będzie to kontroler topViewController kontrolera nawigacyjnego.

In aviewcontroller ' s preparedforsegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
     CviewController* controller = 
        (CviewController*)[[segue destinationViewController] topViewController];
    [controller setDataFromA:self.data];
}

Zauważ, że w tym przypadku musimy użyć starej składni [[przekazywanie wiadomości]]. Jeśli użyjemy nowoczesnego.własność.składnia otrzymujemy błąd kompilacji. Dzieje się tak dlatego, że program nie zna typu desinationViewController i odmawia przyjęcia topViewController jako właściwości nieznanego typu. Ale to jest szczęśliwy, aby [wysłać [prawdziwe wiadomości]] do nieznanego typu. Musimy również (typecast*), aby uniknąć ostrzeżeń kompilatora.

 20
Author: foundry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-14 07:09:06