以编程方式将视图控制器与故事板一起推送的备选方法

我正在寻找替代方法推视图控制器在故事板上以编程方式实例化。 实际上我发现了两种方式,我用它来转到下一个视图,但也要回到以前的:

  1. 使用pushViewController

     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"]; [self.navigationController pushViewController:lvc animated:YES]; 
  2. 以编程方式执行Segue

     [self performSegueWithIdentifier: @"SongSegue" sender: self]; 

你是否有一些关于替代方法的提示,以及这个操作应该执行的最佳方式? 请注意,我不是指模态视图。

Applebuild议使用performSegueWithIdentifier:sender:someObject以编程方式执行segues。 这样做至less有两个好处:

  • 你自己的代码更less意味着你让框架做更多的工作。 如果苹果在推出游戏时提供了一些超酷的新视觉效果,或者提高了性能,或者修复了一些未来iOS版本中的错误,那么您的应用程序可以免费获得。 而且你写的每一行代码都可以为框架做的工作增加你写错误的机会。

  • 更多的IB可以意味着更容易改变。 如果您决定要将所有推式赛段改为模态赛段,或者是您自己制作超酷视觉效果的自定义赛车types,则可以在IB中select'全部',只需单击即可改变赛格式,而不是狩猎在你的代码中。


另外,无论您使用第一种还是第二种方法,推送视图控制器以便“回”到先前的视图控制器都不会像用户所期望的那样工作。 当你推送一个SongViewController ,它被添加到导航堆栈的末尾:

 LocationViewController -> SongViewController 

如果您再次推送LocationViewController去“回”:

 LocationViewController -> SongViewController -> LocationViewController 

如果用户点击导航栏中的后退button,他们将再次从位置视图返回到歌曲视图到位置视图。 (另外,如果你一直这样做的话,每一个“后退”和“前进”都会join到不断增加的视图控制器链中,这可能会导致其他问题。)

相反,你应该让导航控制器处理返回。 它在导航栏中放置了一个button,用于处理大多数用例。 如果您需要自行控制返回,则无法使用iOS 5在IB中执行此操作,但可以使用导航控制器的popViewControllerAnimated:方法以编程方式执行此操作。

就我个人而言,当我在UINavigationController下的UIViewController中使用#2。 我不认为它会工作,没有UINavigationController。

当我使用UITabBarController下的视图时,我使用下面的代码转换到另一个选项卡:

 NSUInteger tabIndex = 2; // Index of the tab I want to select UIViewController * viewCtrl = [_tabController.viewControllers objectAtIndex:tabIndex]; _tabController.selectedViewController = viewCtrl;