web-dev-qa-db-ja.com

別のビューを含むNavigation Controllerを使用してセグエにプロパティを設定する

セグエにプロパティを設定しようとするとクラッシュします。これは、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ではなくビューに直接移動するように設定しても機能しますが、実際にはナビゲーションが必要です。これを回避するにはどうすればよいですか?

34
user2529626

宛先View Controllerは実際にはNavigation Controllerなので、次のようにルートビューにアクセスしてみてください。

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

Swiftの場合:

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

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];
    }
}
7
Guto Araujo

セグエの準備でView Controllerクラスを見てください-それはnavコントローラーです。そのクラスにキャストすると、トップビューコントローラーを要求することで目的のビューに到達できます。

0
David H