如果我使用情节提要,是创建segue并使用performSegueWithIdentifier还是仅使用presentViewController将用户从一个View Controller移至另一个ViewController的更好实践。
在此示例中,假设我们使用的是Swift 5,我有2个故事板:MainViewController上的Contacts的TableView以及DetailViewController上的Contact的详细信息。
在我的代码中,我正在使用presentViewController,但是由于我是iOS开发的新手,所以我不确定这是否是最佳方法。
答案 0 :(得分:0)
他们两个都做同样的事情,但是我通常使用Present,所以当我想更改行为时,例如,使按钮打开另一个VC,我只需要更改标识符,就不必删除segue和创建一个新的。 同样,很多话题会使您的分镜脚本看起来像意大利面条
答案 1 :(得分:0)
为了说明目的,让我们假设情节提要中的情况如下:
ViewController1
|----> modal segue "toVC2" emanating from ViewController1
|----> ViewController2, identifier "VC2"
然后在ViewController1代码中,这两件事之间绝对没有功能或有效区别:
performSegue
的{{1}} "toVC2"
调用instantiateViewController
,然后调用"VC2"
话虽如此,我会提出一种理由,认为每种方式都比其他方式“更好”。
在我的示例中,segue看起来并没有好得多,因为我们仍然必须使用代码来调用present
。但是,假设segue不是从视图控制器发出的,而是从视图控制器视图中的 button 发出的。这是一个动作 segue,现在当用户点击我们的按钮时,将自动 执行segue,而无需执行 。您甚至不需要知道标识符。 (字符串标识符是犯错误的好方法。)
performSegue
和instantiate
可能更好关于选择的事情非常可怕,无论是动作选择还是使用present
的手动触发的选择-即,当(通常如此)您想要将数据从第一个视图控制器传递给第二个视图控制器时。如果使用segue,则必须在performSegue
的实现中进行数据传递。这非常混乱,因为您必须检查segue标识符并将目标转换为正确的类。此外,如果存在多个segue,prepare(for:sender:)
会成为一个混乱的瓶颈。而且,如果我们也调用prepare
,那么我们将在两个不同的地方进行操作-调用performSegue
的方法和performSegue
的单独实现。
相比之下,如果我们调用prepare
,则返回给我们的是视图控制器实例本身。我们仍然必须强制转换,但是现在我们可以在那时和那里传递数据,而不必“等待” instantiateViewController
,也不必经历瓶颈。因此,这是一种更加清晰易懂的封装方法。
这似乎也很明显,但是说prepare
的好处是,它可以在代码中告诉我们过渡是什么。如果您仅使用segue标识符,则这是情节模式segue会隐藏在情节提要中。
都不是。如果可以的话,我宁愿根本不为演示的视图控制器使用情节提要。我使用视图控制器和同名笔尖。这样,我只需实例化视图控制器本身,然后将数据和present
传递给它,而无需进行强制转换,也不需要任何标识符。
不。故事板的优点是可以绘制出应用程序的场景结构,尤其是当您使用Segues时。但是,如果您不要对视图控制器使用segue,那么我真的看不到将视图控制器最初放在情节提要中的意义。同名的笔尖机制更清晰更清洁。此外,我认为present
机制是整个故事板架构中的致命缺陷。堆栈溢出中显示的绝大多数错误都是此缺陷的结果。