【问题标题】:Alternative ways to push view controllers with storyboard programmatically以编程方式使用情节提要推送视图控制器的替代方法
【发布时间】:2012-02-21 06:14:12
【问题描述】:

我正在寻找以编程方式推送在情节提要上实例化的视图控制器的替代方法。 我实际上找到了两种方法,用于转到下一个视图,也可以返回到上一个视图:

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

您对替代方案和执行此操作的最佳方式有一些提示吗?请注意,我指的不是模态视图。

【问题讨论】:

  • 就个人而言,由于您使用的是 Storyboard 和 segues,因此 #2 是一种更好的方法。
  • 如果你必须推送一个不能有 segue 的视图控制器,#1 可能有用吗?即从地图视图注释的披露按钮推送视图控制器。
  • 任何东西都可以有一个segue。并非所有东西都可以有一个完全在 IB 中制作的 自动 segue(如按钮和表格单元格)。但是您仍然可以从视图控制器本身开始在 IB 中创建一个 segue,并使用 #2 来执行它;这正是您为地图标注按钮所做的。
  • 如果你的故事板中有目标视图控制器,我建议使用#2(你几乎必须这样做才能使用segue)。但是当您以编程方式创建视图控制器(例如非常简单/一次性使用的视图控制器)时,#1(或者更确切地说只是最后一行)。

标签: ios views push storyboard


【解决方案1】:

Apple 建议使用performSegueWithIdentifier:sender:someObject 以编程方式执行转场。这样做至少有几个优点:

  • 您自己的代码更少意味着您让框架完成更多工作。如果 Apple 为 push segues 提供了一些超酷的新视觉效果,或者提高了性能,或者修复了未来 iOS 版本中的错误,你的应用程序可以免费获得。而且,您编写的每一行代码都可以让框架为您完成工作,这会增加您编写错误的机会。

  • IB 中的更多内容 意味着更容易更改。如果您决定要将所有推送转场更改为模态转场,或者某些自定义转场类型,您可以在其中制作自己的超酷视觉效果,您可以在 IB 中选择它们并一键更改转场类型而不是狩猎在你的代码中。


此外,无论您使用第一种方法还是第二种方法,推送视图控制器以“返回”到前一个视图控制器都不会按照用户期望的方式工作。当您推送 SongViewController 时,它会被添加到导航堆栈的末尾:

LocationViewController -> SongViewController

如果你再次按下LocationViewController 以“返回”:

LocationViewController -> SongViewController -> LocationViewController

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

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

【讨论】:

    【解决方案2】:

    就个人而言,当我在 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;
    

    【讨论】:

    • 不应该是objectAtIndex:0 是objectAtIndex:tabIndex?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2016-07-21
    • 2012-06-08
    • 2013-10-08
    • 2012-02-12
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多