Настройка свойства в сегменте с помощью контроллера навигации, содержащего другое представление
У меня возникает авария при попытке установить свойство в моем 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. Как мне обойти это?
Ответы
Ответ 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. Передайте его этому классу, затем вы можете получить желаемый вид, запросив его для своего контроллера верхнего уровня.