2017-07-24 118 views
0

是否有人知道是否存在以MVC方式以编程方式处理segse的特定模式? 我认为最好的方法是使用控制器中的事件系统。 我希望所有视图控制器连接到此导航控制器,而不是处理viewController逻辑本身内的所有逻辑。我想出去源这个逻辑Segmented Programatically Pattern

感谢

+0

navigationController.pushViewController和navigationController.popViewController? –

+0

嗨Reinier。当然,我知道这个功能......但它不是mvc安全的......因为VC1必须知道VC2。 真的应该有一个动作的调用..就像“离开屏幕”..控制器(navigationController)然后应该处理逻辑...而不是vc。 – mogio

+0

这就是为什么我要求一个模式。 另外如何处理覆盖菜单和东西......疯狂地定义它们在每个vc或应用程序委托中。 应该有一个类来处理这个逻辑。一个控制器。 – mogio

回答

0

在大部分的视图控制器,你将有机会获得一个prepareForSegue功能,一个名为sender一个参数。

如果您用performSegue(withIdentifier: "mySegueID", sender: yourVC)以编程方式启动segue,那么将调用此函数,并且您将能够将信息从发送者传递到新的视图控制器。

在这个函数中,为了获得下一个VC的句柄,使用segue.destinationViewController

+0

谢谢dokun1。 这也是我现在这样做的方式。最佳实践规则中是否存在任何与此相关的模式? – mogio

+0

我会在哪里放置用于打开叠加元素的逻辑,例如侧边菜单或错误消息...必须有这种模式。我似乎无法找到任何东西。 – mogio

0

我不知道一个特定的模式,但一个简单的方法来编程方式处理2 UIViewController之间的转换可能是有一个分开的经理,他们的工作就是推/提供过流/不管新的控制器,并弹出/解雇/任何目前的控制器旧的。

我通常这样做的方式是让我们可以命名为WorkflowManager的类,它将处理所有转换。与此Manager关联,您声明WorkflowManagerComponent协议,并实现它:

protocol WorkflowManagerComponent { 
    var completionHandler: (hasCompleted:Bool,data:Any)->() {get set} 
} 

请致电completionHandler(true,someData)当用户点击“下一个”按钮,或completionHandler(false,nil)当用户点击一个“每个UIViewController中实现这一点,例如返回键。

然后在您的工作流程管理器,您可以根据在completionHandler发送的参数进行过渡到下一首或上UIViewController

//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从他人分开,释放掉任何转换逻辑。

+0

抱歉,延迟反馈。谢谢Imotep - 我会研究它。 – mogio