Segues编程模式

时间:2017-07-24 13:28:14

标签: ios events model-view-controller controller

有人知道MVC方式是否存在以编程方式处理segue的某种模式? 我认为最好的方法是在控制器中使用事件系统。 我希望所有视图控制器都连接到这个navigationController,而不是处理viewController逻辑本身内的所有逻辑。我想要出源这个逻辑

2 个答案:

答案 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) 分开,释放任何过渡逻辑。