有人知道MVC方式是否存在以编程方式处理segue的某种模式? 我认为最好的方法是在控制器中使用事件系统。 我希望所有视图控制器都连接到这个navigationController,而不是处理viewController逻辑本身内的所有逻辑。我想要出源这个逻辑
答案 0 :(得分:0)
在大多数视图控制器中,您可以访问prepareForSegue
函数,其中一个参数名为sender
。
如果用performSegue(withIdentifier: "mySegueID", sender: yourVC)
以编程方式启动segue,则会调用此函数,并且您将能够将信息从发件人传递到新的视图控制器。
在此功能中,要获得下一个VC的句柄,请使用segue.destinationViewController
。
答案 1 :(得分:0)
我不知道某个特定的模式,但是以编程方式处理2 UIViewController
之间转换的简单方法可能是让一个独立的管理器,其工作就是推送/呈现/任何新的控制器超过当前,以及弹出/解除/无论当前的控制器到旧的控制器。
我通常这样做的方法是创建一个名为WorkflowManager
的类,它将处理所有转换。与此经理相关联,您声明了WorkflowManagerComponent
协议并实施它:
protocol WorkflowManagerComponent {
var completionHandler: (hasCompleted:Bool,data:Any)->() {get set}
}
让每个UIViewController实现这一点,例如当用户点击" next"时调用completionHandler(true,someData)
。按钮,或completionHandler(false,nil)
,当用户点击"返回"按钮。
然后在工作流程管理器中,根据UIViewController
中发送的参数执行转换到下一个或上一个completionHandler
:
//init viewController1 ...
viewController1.completionHandler = onViewController1Completes
// ...
func onViewController1Completes(_ completed: Bool, data: Any) {
if hasCompleted {
//init viewController2 ...
viewController2.data = data
viewController2.completionHandler = onViewController2Completes
//Push the new vc
viewController1.navigationController.push(viewController2, animated: true)
} else {
//The vc1 was presented as a modal, dismiss it
viewController1.dismiss()
}
}
这样,每个UIViewController
与其他a = [1, 1, ["ALPHA"]]
b = [2, 2, ["BETA"]]
c = [a[i]+b[i] for i in range(len(a))]
print(c)
分开,释放任何过渡逻辑。