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! 纽约会议。