2013-11-04 9 views
34

私のsegueでプロパティを設定しようとするとクラッシュします。これは、ルートビューとしてTableViewを持つナビゲーションコントローラにプロパティを渡すUIViewです。私のTableViewControllerに行くはずですが、NavigationControllerによって傍受され、認識できないセレクターエラーがスローされているようです。別のビューを含むNavigation Controllerでセグのプロパティを設定する

セグエ:

- (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ではなく、ビューに直接移動すると機能しますが、実際にナビが必要です。これをどうやって回避するのですか?

答えて

73

先ビュー・コントローラは、実際にナビゲーションコントローラであるので、そのようなルートビューにアクセスしてみてください:

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

私はこれもタブバーコントローラの場合と似ていると思いますか?助けてくれてありがとう。 –

+0

私はときどき人々が正しいVCを得て、時にはそうではないことを知ります。非常に奇妙な。最終的なデスティネーションビューコントローラを取得するようにアプリケーションに指示する何らかの設定がどこかにありますか? – mikebz

+1

また、[navController topViewController] – Iwaz

0

segueの準備でView Controllerクラスを見てください。これはnavコントローラです。そのクラスにキャストして、それからトップビューコントローラーを要求して、目的のビューに移動できます。

7

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]; 
    } 
} 
6

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