Подтвердить что ты не робот

Настройка свойства в сегменте с помощью контроллера навигации, содержащего другое представление

У меня возникает авария при попытке установить свойство в моем segue. Это UIView, передающий свойство контроллеру навигации, который имеет представление TableView в качестве корневого представления. Он должен перейти в мой TableViewController, но похоже, что он перехватывается этим NavigationController и бросает непризнанную ошибку селектора.

Segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showItems"]) {
        ShowItemsTableViewController *destinationViewController = [segue destinationViewController];

        [destinationViewController setItems:[self itemsFromCoreData]];
    }
}

Ошибка:

-[UINavigationController setItems:]: unrecognized selector sent to instance 0x10920c840

Что здесь происходит? У этого NavigationController нет связанного с ним класса, он просто в раскадровке и появляется модально. Он работает, если я установил segue в раскадровке, чтобы перейти непосредственно к представлению, а не NavigationController, но мне действительно нужен nav. Как мне обойти это?

4b9b3361

Ответ 1

Поскольку контроллер представления назначения на самом деле является контроллером навигации, попробуйте получить доступ к корневому представлению следующим образом:

UINavigationController *navController = [segue destinationViewController];
ShowItemsTableViewController *SITViewController = (ShowItemsTableViewController *)([navController viewControllers][0]);
[SITViewController setItems:[self itemsFromCoreData]];

Ответ 2

Получите topViewController из UINavigationController:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showItems"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        ShowItemsTableViewController *showItemsTVC = (ShowItemsTableViewController * )navigationController.topViewController;
        showItemsTVC.items = [self itemsFromCoreData];
    }
}

Ответ 3

Для Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "segueShowNavigation" {
        var DestViewController = segue.destinationViewController as! UINavigationController
        let targetController = DestViewController.topViewController as! ReceiveViewController
    }
}

Ответ 4

Посмотрите на класс контроллера вида в режиме подготовки к segue - это контроллер nav. Передайте его этому классу, затем вы можете получить желаемый вид, запросив его для своего контроллера верхнего уровня.