我正在寻找以编程方式推送在故事板上实例化的视图控制器的替代方法。 我实际上找到了两种方法,用于转到下一个视图,还可以回到上一个视图:
使用pushViewController
:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"];
[self.navigationController pushViewController:lvc animated:YES];
以编程方式执行Segue
:
[self performSegueWithIdentifier: @"SongSegue" sender: self];
您是否对替代方案有一些提示,并且应该以最佳方式执行此操作?请注意,我不是指模态视图。
答案 0 :(得分:36)
Apple建议使用performSegueWithIdentifier:sender:someObject
以编程方式执行segues。这样做至少有几个好处:
您自己的代码较少意味着您让框架完成更多工作。如果Apple为推送segue提供了一些超酷的新视觉效果,或者提高了性能,或者修复了未来iOS版本中的错误,那么您的应用程序可以免费获得。你编写的每一行代码都可以帮助你增加编写错误的机会。
IB中的更多内容可能意味着更容易更改。如果您决定要将所有推送segue更改为模态segue,或者您想要自己的超酷视觉效果的某些自定义segue类型,您可以在IB中选择'em all并通过单击而不是搜索来更改segue类型在您的代码中。
此外,无论您使用第一种方法还是第二种方法,推送视图控制器以“返回”前一个视图控制器都不会像您的用户期望的那样工作。当您按下SongViewController
时,它会添加到导航堆栈的末尾:
LocationViewController -> SongViewController
如果您再次按LocationViewController
以“返回”:
LocationViewController -> SongViewController -> LocationViewController
如果用户点击导航栏中的后退按钮,他们将再次从位置视图返回到歌曲视图到位置视图。 (另外,如果你继续这样做,每个“后退”和“前进”都会增加一个不断增加的视图控制器链,这可能会导致其他麻烦。)
相反,您应该让导航控制器处理回去。它为此目的在导航栏中放置了一个按钮,它应该处理大多数用例。如果您需要让自己的控件返回,则不能在iOS 5中使用IB,但您可以使用导航控制器的popViewControllerAnimated:
方法以编程方式执行此操作。
答案 1 :(得分:4)
就个人而言,当我在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;