セグエにプロパティを設定しようとするとクラッシュします。これは、TableViewをルートビューとして持つNavigation Controllerにプロパティを渡すUIViewです。 TableViewControllerに移動することになっていますが、NavigationControllerによってインターセプトされ、認識できないセレクターエラーをスローしているようです。
セグエ:
- (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にはクラスが関連付けられていません。ストーリーボードにあり、モーダルで表示されます。ストーリーボードでセグエを設定して、NavigationControllerではなくビューに直接移動するように設定しても機能しますが、実際にはナビゲーションが必要です。これを回避するにはどうすればよいですか?
宛先View Controllerは実際にはNavigation Controllerなので、次のようにルートビューにアクセスしてみてください。
UINavigationController *navController = [segue destinationViewController];
ShowItemsTableViewController *SITViewController = (ShowItemsTableViewController *)([navController viewControllers][0]);
[SITViewController setItems:[self itemsFromCoreData]];
Swiftの場合:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "segueShowNavigation" {
var DestViewController = segue.destinationViewController as! UINavigationController
let targetController = DestViewController.topViewController as! ReceiveViewController
}
}
UINavigationControllerからtopViewControllerを取得します。
- (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];
}
}
セグエの準備でView Controllerクラスを見てください-それはnavコントローラーです。そのクラスにキャストすると、トップビューコントローラーを要求することで目的のビューに到達できます。