【问题标题】:Advantages of using segues [closed]使用 segues 的优点 [关闭]
【发布时间】:2016-01-14 13:20:58
【问题描述】:

我在情节提要中创建了新的视图控制器。现在我希望它出现在屏幕上。所有书籍、教程、课程都告诉我应该使用 segue 在控制器之间传输数据。为什么?

通常我会这样做:

let newViewController = self.storyboard.instantiateViewControllerWithIdentifier("newViewController") as NewViewController
self.presentViewController(newViewController, animated: true, completion: nil)

在我看来,这种方式更清晰有用。我可以使用 Interface Builder 创建新场景,用标识符命名它,并随时从情节提要中获取。

这种方法有什么问题?

【问题讨论】:

  • 在我看来,这并没有什么问题。有些人喜欢配置,有些人喜欢代码。 (另一方面,我根本不喜欢在控制器之间传输数据。我宁愿有一个独立的数据模型。)
  • 要详细了解它们之间的区别,可以参考这个stackoverflow.com/questions/30009400/…
  • Segues 使您能够将更多的 UI 设置移动到 Interface Builder,即减少手动代码和出错的可能性。在这种情况下,几乎没有区别。将所有控制器放在一个情节提要中也不是一个好主意。

标签: ios swift


【解决方案1】:

你的方法没有错。就像完全放弃 UIViewController 并自己处理 UIWindow 上的视图层次结构没有任何问题一样。

UIStoryboardSegue 可以作为工具供您使用。它很有用,因为它允许您在必要时在几乎没有代码的情况下在视图控制器之间进行转换。

例如,在我拥有的一个应用程序中(只是一个概念证明)我有一个UIViewController,其中有几个按钮用作菜单,我可以通过每个按钮转换到其他UIViewControllers。但是没有包含代码的子类。它完全在Interface Builder中完成。

它为情节提要增加的内容是对流向何处的清晰程度。您知道视图控制器 A 会转换到视图控制器 B,因为屏幕上有一个箭头告诉您这一点。

【讨论】:

  • 好的,听起来不错。但是当我实际上没有发件人时如何使用 segue 呢?例如,我使用相机,并希望在按下“使用照片”后更改视图控制器。我无法在 Interface Builder 中拖动 segue!
  • @SergeyGamayunov 在这种特定情况下,应该以模式方式呈现相机,并且委托将在它转到另一个视图控制器之前将其关闭。但是,如果您在故事板上没有可以争论的项目,那么只需使用另一种方式。你可以随意混搭。
【解决方案2】:

首先,当您使用 segues 时 - 您的故事板变得更具可读性。每个人都会看到,从这个控制器我可以导航到这个控制器,然后从这个控制器导航到这个控制器。这是segues的一个主要特征。从代码中,很难理解某个控制器连接了哪些控制器。 (其他方式不需要使用storyboards,你可以从nib文件中实例化控制器)

如果它连接到一些操作 UI(按钮、手势、单元格等),它也不需要编写额外的代码。

即使你需要调用“performSegue:”方法,它也比实例化控制器要好。在这种情况下,您可以在不更改代码的情况下更改 segues 类型,这是实例化无法实现的。

我们可以讨论很多想法,但总的想法是您将您在项目中导航的方式封装起来,它可以帮助您减少依赖关系并从情节提要中理解项目中的导航。

【讨论】:

    【解决方案3】:

    这种类型的连接称为segue,代表一个 从一个屏幕过渡到另一个屏幕。故事板连接 到目前为止你看到的是关系,他们描述了一种观点 控制器包含另一个。另一方面,转场发生了变化 屏幕上有什么。通过点击按钮、表格触发 Segues 查看单元格、手势等。

    它是故事板羽毛,用于通过 segue 传回和第四个数据,并通过 destinationViewController 和 sourceViewController.identifier 属性展开 segue,用于比较不同的屏幕。检查更多参考this

    例如,将数据传递到下一个屏幕。

      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
            if ([segue.identifier isEqualToString:@"showRecipeDetail"]) {
                NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
                RecipeDetailViewController *destViewController = segue.destinationViewController;
                destViewController.recipeName = [recipes objectAtIndex:indexPath.row];
            }
        }
    

    Ex.Pass data back screen,

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        SettingsViewController *settingsViewController = [segue sourceViewController];
        [settingsViewController setAddressString:[self addressString]];
        NSLog(@"Settings address string of SettingsViewController to: %@", [self addressString]);
        settingsViewController.delegate = self;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2011-06-07
      • 2012-03-10
      • 1970-01-01
      • 2013-01-26
      • 2019-11-16
      • 2011-04-01
      • 2012-11-06
      • 2010-12-17
      相关资源
      最近更新 更多