iOS中的导航器– Marc StevenCoder –中

在iOS中,存在从ScreenA到Screen B的基本数据流。

您的ViewController A可能具有以下内容:

override func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath) { 
let detailsData = tableData[indexPath.row]
let detailViewController = ViewControllerB()
detailViewController.data = detailData
navigationController?.pushViewController(detailViewController,animated:true)
}

您的viewcontrollerB可能有这样的东西:

 init() { 

navigationItem:rightBarButtonItem = UIBarButtonItem(title:"Go to ViewController c!",style:.plain,target:self,action:#selector(didTapGoButton))
}
func didTapGoButton() {
let followingViewController = ViewControllerC()
navigationController?.pushViewController(nextVC,animated:true)
}

但是,这有什么问题呢?
大多数开发人员每天都会以标准动作编写此代码。

ViewController的作用:
1,父母
2,孩子
3,老板

在ViewControllerA中,有很多工作要做。
有什么问题?
ViewController不是独立的
viewController依赖n有可以做某些事情的父母
ViewController做得太多(流程,演示等等)
解决方案v1:委派
[]()
使用委派拥有一个主viewController来完成所有操作

它是如何工作的?

1,每个viewController需要导航有一个委托

2,我们的rootViewController是MasterNavigationViewController:UINavigationController

3,MasterNavigationViewController配置每个vc并为其委托

是什么颂歌此修复程序?

1,单个viewControllers不控制流/表示

2,个别viewController不需要了解他们的父母

3,单独的viewController不会创建其他非子viewControllers。

有什么不好的?

1,在viewController中尽我们所有的魔力

2,代码重复和/或委托之间的隐式依赖

3,一般很多样板,一切都有导航代表!

注意:MasterNavigationViewController仍然是viewController
1,随着应用的增长,这个顶级viewController可能会容纳其他逻辑控制逻辑。
2,仍然与UIKit的所有viewController生命周期魔术联系在一起。
3,ViewController委托可以轻松完成各种任务,而不仅仅是导航。
这么多样板

1,每个可以导航的VC现在必须有一个委托

2,样板随着导航量的增加而增长

解决方案v2:导航器

导航器有什么优点?

1,独立对象

2,不依赖于viewController的生命周期或职责

3,我们可以使用导航器协议而不必重复样板

4,…..并分组功能

它是如何工作的?

1,Navigator是基本协议

2,所有导航器协议均符合导航器

3,Navigator协议按功能分组,而不是按ViewController分组

但是众所周知,还有其他处理方式,例如Coorditator / FlowController。

灵感来自Try Swift! 纽约会议。