我正在构建一个 iOS 框架,它应该提供一些通用模块,如注册、忘记密码、登录和配置文件等。因此,任何导入我的框架的应用程序都应该能够按原样使用这些屏幕。我面临的挑战是在我的 iOS 框架代码中从一个屏幕导航到另一个屏幕。当从一个屏幕 Login(screen1) 导航到另一个屏幕 Forgot Password(screen2) 时,将在 screen1 视图控制器而不是 screen2 视图控制器中调用处理程序(回调)方法。我们尝试使用 xib 和故事板,但是我没有找到解决方案。
有人可以指出任何具有类似功能的示例代码吗?
我在理解 iOS 概念时是否遗漏了一些东西,我正在构建一个包含一些 UI 流程的 iOS 框架,这可能吗?
我建议使用委托模式,因为回调更多是一次性的,而委托可以更好地持续协助对象的生命周期。无论如何,我已经创建了一个示例来满足您的要求,请在此处git (包括框架 + 测试应用程序)
它涉及一个 LoginController,它是框架的主要入口点和管弦乐队。
当您初始化它时,您传递一个回调,该回调将用于发送事件,包括“忘记密码”和“用户想要退出”,这些在枚举中定义。
public enum LoginFrameworkStatus {
case Login
case ForgotPassword
case Help
case Disaster
case Exited
case UserWantsExit
}
类提供了一个入口点来启动这个过程:
public func enterLoginWorkflow(on controller: UIViewController, callback: LoginFrameworkCallback) {
let myBundle = Bundle(for: LoginController.self)
if let navi = UIStoryboard(name: "LoginWorkflow", bundle: myBundle).instantiateInitialViewController() as? MySpecialNavigationController {
presentingController = controller
navi.loginController = self
self.callback = callback
controller.present(navi, animated: true, completion: {
//presented!
callback?( .Login, navi, self) //If reference to LoginController is lost, tell the callback there's a problem.. shouldn't happend because we have a strong reference on the navigation controller.
})
}
}
.. 和一个退出点:
public func leaveLoginWorkflow() {
presentingController?.dismiss(animated: true, completion: {
self.callback?(.Exited, nil,self)
})
}
因此,您的框架的主界面将是:
LoginController().enterLoginWorkflow(on: self) { (status, controller, loginController) in
print("\(status) in \(controller?.description ?? "No Controller")")
switch status {
case .UserWantsExit:
loginController?.leaveLoginWorkflow()
case .ForgotPassword:
loginController?.leaveLoginWorkflow()
default:
()
}
}
在测试应用程序中,我包含了一个最小的工作流程供您测试。
让我知道这是否是您所需要的,或者您是否想研究委托模式,我认为这更适合于此。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句