是执行SegueWithIdentifier还是presentViewController的更好实践

时间:2019-06-01 19:13:01

标签: ios swift storyboard segue

如果我使用情节提要,是创建segue并使用performSegueWithIdentifier还是仅使用presentViewController将用户从一个View Controller移至另一个ViewController的更好实践。

在此示例中,假设我们使用的是Swift 5,我有2个故事板:MainViewController上的Contacts的TableView以及DetailViewController上的Contact的详细信息。

在我的代码中,我正在使用presentViewController,但是由于我是iOS开发的新手,所以我不确定这是否是最佳方法。

2 个答案:

答案 0 :(得分:0)

他们两个都做同样的事情,但是我通常使用Present,所以当我想更改行为时,例如,使按钮打开另一个VC,我只需要更改标识符,就不必删除segue和创建一个新的。 同样,很多话题会使您的分镜脚本看起来像意大利面条

答案 1 :(得分:0)

为了说明目的,让我们假设情节提要中的情况如下:

ViewController1
    |----> modal segue "toVC2" emanating from ViewController1
        |----> ViewController2, identifier "VC2"

然后在ViewController1代码中,这两件事之间绝对没有功能或有效区别:

  • 呼叫标识符为performSegue的{​​{1}}
  • 在情节提要上用标识符"toVC2"调用instantiateViewController,然后调用"VC2"

话虽如此,我会提出一种理由,认为每种方式都比其他方式“更好”。

为什么segue可能更好

在我的示例中,segue看起来并没有好得多,因为我们仍然必须使用代码来调用present。但是,假设segue不是从视图控制器发出的,而是从视图控制器视图中的 button 发出的。这是一个动作 segue,现在当用户点击我们的按钮时,将自动 执行segue,而无需执行 。您甚至不需要知道标识符。 (字符串标识符是犯错误的好方法。)

为什么performSegueinstantiate可能更好

关于选择的事情非常可怕,无论是动作选择还是使用present的手动触发的选择-即,当(通常如此)您想要将数据从第一个视图控制器传递给第二个视图控制器时。如果使用segue,则必须在performSegue的实现中进行数据传递。这非常混乱,因为您必须检查segue标识符并将目标转换为正确的类。此外,如果存在多个segue,prepare(for:sender:)会成为一个混乱的瓶颈。而且,如果我们也调用prepare,那么我们将在两个不同的地方进行操作-调用performSegue的方法和performSegue的单独实现。

相比之下,如果我们调用prepare,则返回给我们的是视图控制器实例本身。我们仍然必须强制转换,但是现在我们可以在那时和那里传递数据,而不必“等待” instantiateViewController,也不必经历瓶颈。因此,这是一种更加清晰易懂的封装方法。

这似乎也很明显,但是说prepare的好处是,它可以在代码中告诉我们过渡是什么。如果您仅使用segue标识符,则这是情节模式segue会隐藏在情节提要中。

我更喜欢哪个?

都不是。如果可以的话,我宁愿根本不为演示的视图控制器使用情节提要。我使用视图控制器和同名笔尖。这样,我只需实例化视图控制器本身,然后将数据和present传递给它,而无需进行强制转换,也不需要任何标识符。

所以我说故事板根本不好吗?

不。故事板的优点是可以绘制出应用程序的场景结构,尤其是当您使用Segues时。但是,如果您要对视图控制器使用segue,那么我真的看不到将视图控制器最初放在情节提要中的意义。同名的笔尖机制更清晰更清洁。此外,我认为present机制是整个故事板架构中的致命缺陷。堆栈溢出中显示的绝大多数错误都是此缺陷的结果。