web-dev-qa-db-ja.com

データnavigationViewControllerを渡すiOSストーリーボード

ビュー間でデータを適切に渡すことに問題がありますが、標準的な方法ではありません。

私の問題を説明する写真:

http://i.stack.imgur.com/0jHYC.png

I performSegueWithIdentifier 2つのセグエ識別子のいずれかを使用して、「Firmy」または「Oddzialy」と呼ばれるデータをViewControllerに渡します。

データコードの受け渡し:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  if ([[segue identifier] isEqualToString:@"sLogowanieFirmy"]) {
      FirmyVC *firmyVC = [segue destinationViewController];
      firmyVC.tabFirmy = self.tabFirmy;
  }
  if ([[segue identifier] isEqualToString:@"sLogowanieOddzialy"]) {
      OddzialyVC *oddzialyVC = [segue destinationViewController];
      oddzialyVC.wybranaFirma = [self.tabFirmy objectAtIndex:0];
  }
}

問題はメソッドにあります[segue destinationViewController] segueのdestinationViewControllerはNavigationViewControllerであるため。

では、データを渡し、独立したナビゲーションコントローラーを使用する適切な方法は何でしょうか。

31
sliwinski.lukas

UINavigationControllerにはtopViewControllerというプロパティがあり、スタックの最上位にあるViewControllerを返します。

だからあなたのprepareForSegue:メソッドは次のようになります...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"sLogowanieFirmy"]) {
        UINavigationController *nav = [segue destinationViewController];
        FirmyVC *firmyVC = (FirmyVC *)nav.topViewController;
        firmyVC.tabFirmy = self.tabFirmy;
    }

    // etc...
}
58
Mark Adams

ここにそれはSwiftにあります:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{    
    if (segue.identifier == "sLogowanieFirmy") {
        let nav = segue.destinationViewController as! UINavigationController 
        let firmyVC = nav.topViewController as! FirmyVC
        firmyVC.tabFirmy = self.tabFirmy            
    }

    // etc...
}
3
mmd1080