Как я могу передать значение между NavigationController и ViewController с раскадровкой?
у меня проблема
Ниже приведена моя раскадровка,
первый контроллер-это TabBarController,
и это отношение с A (ViewController).

Это ViewController,
B-это a NavigationController, страница изменения на B by modal segue
C-это ViewController, C изменится на другую страницу по push поэтому мне нужен NavigationController
Хорошо, я хочу передать значение от A до C,
теперь я могу передать значение от A до B prepareForSegue,
Однако, поскольку B и C имеют отношения, но не segue,
Поэтому я не могу передать значение из B в C по prepareForSegue!!!
Как я могу передать значение между NavigationController и ViewController с раскадровкой?
1 ответов
изображение раскадровки здесь немного вводит в заблуждение.
когда вы переходите на B,на самом деле вы переходите к комбо B/C, поскольку NavControllers всегда имеют хотя бы один viewController в своем стеке (который является их topViewController и [viewControllers objectAtIndex:0]).
таким образом, у вас есть отношения непосредственно от A до C.
как вы получаете доступ к этому контроллеру, зависит от того, является ли ваш segue модальные или пуш. В вашем случае это модально, но я опишу оба, чтобы вы могли видеть разницу.
в любом случае, чтобы передать данные в C, вам нужно объявить свойство в его заголовочном файле
    @interface CviewController: UIViewContrller
    @property (assign) int dataFromA;
    @end
нажмите segue
в push-сегменте фактически C является destinationViewController, а не B. На самом деле push-сегмент управляется B, который является UINavigationController как для A, так и для C. Код за push-сегментом имеет форма[self.navigationController pushViewController:otherViewController];
в prepareForSegue AviewController:
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
        {
         CviewController* controller = segue.destinationViewController;
        [controller setDataFromA:self.data];
    }
это возможно в раскадровке, чтобы сделать толчок сегментировать линию между двумя viewControllers, которые делают не общий UINavigationController. Однако при запуске этого вы получите ошибку сбоя:
'не удалось найти навигационный контроллер для segue 'pushC'. Push-сегменты могут использоваться только тогда, когда исходный контроллер управляется экземпляр UINavigationController.'
за каждым хорошим толчком segue лежит навигационный контроллер.
модальный переход
код, скрывающийся за модальным сегментом, - это метод UIViewController- (void)presentViewController:(UIViewController *)viewControllerToPresent 
в модальном сегменте для комбинации NavController/ViewController целевой viewController-это то, на что указывает линия сегментации. Если он указывает на viewController, это сегмент.destinationController (и UINavigationController будет проигнорирован, что не то, что вы хотите здесь); если он указывает на UINavigationController, как в этом случае,это будет это destinationController. Но доступ к viewController по-прежнему прост, так как это будет topViewController навигационного контроллера.
в prepareForSegue AviewController:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
     CviewController* controller = 
        (CviewController*)[[segue destinationViewController] topViewController];
    [controller setDataFromA:self.data];
}
обратите внимание, что в этом случае мы должны использовать синтаксис старого стиля [[передача сообщений]]. Если мы используем современный.свойство.синтаксис получаем ошибку компиляции. Это потому, что программа не знает тип desinationViewController и отказывается принимать topViewController как свойство неизвестного типа. Но это!--10-->и счастлив [отправить [реальные сообщения]] неизвестному типу. Мы также должны (typecast*), чтобы избежать предупреждений компилятора.
