【问题标题】:Segues Programmatically Pattern以编程方式进行模式
【发布时间】:2017-12-30 02:52:23
【问题描述】:

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

【问题讨论】:

  • navigationController.pushViewController 和 navigationController.popViewController?
  • 嗨,雷尼尔。我当然知道这个功能......但它只是不是 mvc 安全......因为 VC1 必须了解 VC2。真的应该调用一个动作......像“离开屏幕”......然后控制器(navigationController)应该处理逻辑......而不是vc。
  • 这就是为什么我要一个模式。还有如何处理覆盖菜单和东西......疯狂地在每个 vc 或应用程序委托中一直定义它们。应该有一个处理该逻辑的类。控制器。

标签: ios events model-view-controller controller


【解决方案1】:

我不知道特定的模式,但以编程方式处理 2 UIViewController 之间的转换的一种简单方法可能是有一个单独的管理器,其工作只是推送/呈现/任何新的控制器,并弹出/dismiss/whatever 当前控制器到旧控制器。

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

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

让每个 UIViewController 实现这一点,例如,当用户点击“下一步”按钮时调用 completionHandler(true,someData),或者当用户点击“返回”按钮时调用 completionHandler(false,nil)

然后在您的工作流管理器中,根据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 都与其他UIViewController 分开,释放任何转换逻辑。

【讨论】:

  • 抱歉反馈延迟。谢谢 Imotep - 我会调查的。
【解决方案2】:

在大多数视图控制器中,您都可以访问prepareForSegue 函数,其中一个参数称为sender

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

在此函数中,要获取下一个 VC 的句柄,请使用 segue.destinationViewController

【讨论】:

  • 谢谢 dokun1。这也是我目前的做法。是否有任何具有最佳实践规则的模式如何使用它?
  • 我应该把打开覆盖元素的逻辑放在哪里,比如侧边菜单或错误消息......必须有一个模式。我似乎找不到任何东西。
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2020-06-17
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多