iOS中怎么利用MVVM实现路由
iOS中怎么利用MVVM实现路由,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
##路由列表:
Login > 主页面Sign Up > 注册页面Forgot Password(?) > 忘记密码页面
这看起来像是一个简单的页面,可以使用带有3个segues的故事板来实现。但请相信我,事实并非如此。例如,您通常会在登录时打开主屏幕。但在这种情况下,用户的密码可能已过期,您需要实施重定向到更改密码屏幕。所以登录路线变成:
Login > 主页面 或者 更改密码页面
这是故事板路由失败的地方。它无法处理这种动态情况。所以你通常做的是让VC处理它:
func loginButtonTapped() { // Start network request... // Upon response: if viewModel.shouldChangePassword { performSegue(id: "ChangePasswordScreen", sender: nil) } else { performSegue(id: "HomeScreen", sender: nil) }}
这是路由逻辑,它不应该在VC中。如果您想要轻型VC,请在编写if语句之前三思而后行。他们是决定代码,他们不属于那里。根据我的理解,VC应该只有视图相关和粘合代码。从来没有决定代码。让我们定义一个路由器协议,并从VC中取出这些if语句。我们会需要:
路由ID:像segue ID一样的一个字符串上下文:当前视图控制器是从哪里跳过来的可选的参数:过渡所需的临时数据。 (tableview点击了哪一行等等)
protocol Router { func route( to routeID: String, from context: UIViewController, parameters: Any? )}
VC应该只定义路由名称,而不关心该路由的位置。这将是路由器的工作。
class LoginViewController: UIViewController { enum Route: String { case login case signUp case forgotPassword } var viewModel: LoginViewModel! var router: Router! ... func loginButtonTapped() { router.route(to: Route.login.rawValue, from: self) } func signUpTapped() { router.route(to: Route.signUp.rawValue, from: self) } func forgotPasswordTapped() { router.route(to: Route.forgotPassword.rawValue, from: self) }}
如上所述,登录按钮可以进入主页面或更改密码页面。那么路由器如何选择正确的目的地呢?在这种情况下,您的路由器可能需要访问您的VM。这样,它可以直接读取业务决策并决定目的地。
请注意VC已经retain了VM和路由器。因此,路由器对VM应该是weak/unowned引用。
class LoginRouter: Router { unowned var viewModel: LoginViewModel init(viewModel: LoginViewModel) { self.viewModel = viewModel } func route( to routeID: String, from context: UIViewController, parameters: Any?) { guard let route = LoginVC.Route(rawValue: routeID) else { return } switch route { case .login: if viewModel.shouldChangePassword { // Push change-password-screen. } else { // Push home-screen. } case .signUp: // Push sign-up-screen: let vc = SignUpViewController() let vm = SignUpViewModel() vc.viewModel = vm vc.router = SignUpRouter(viewModel: vm) context.navigationController.push(vc, animated: true) case . forgotPasswordScreen: // Push forgot-password-screen. } }}
关于iOS中怎么利用MVVM实现路由问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注恰卡编程网行业资讯频道了解更多相关知识。
推荐阅读
-
ios14系统怎么用nfc(ios 14新增的nfc功能怎么用)
ios14新增的nfc功能怎么用?1.打开iPhone后,选择手机的[设置]图标。2.进入后,点击【通用】选项进入。3.单击并选...
-
微信小程序iOS端怎么暂停animated动画
-
iOS中多线程的示例分析
-
ios启动私有链查询区块信息的方法是什么
ios启动私有链查询区块信息的方法是什么本篇内容介绍了“ios启动...
-
正则表达式在ios中怎么用
正则表达式在ios中怎么用这篇文章主要为大家展示了“正则表达式在i...
-
如何进行iOS中的信息泄露漏洞CVE-2020-9964分析
如何进行iOS中的信息泄露漏洞CVE-2020-9964分析今天就...
-
iOS中怎么删除无用的类
本篇文章给大家分享的是有关iOS中怎么删除无用的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话...
-
iOS中怎么实现一个序列动画
这篇文章给大家介绍iOS中怎么实现一个序列动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。UIViewPr...
-
iOS中怎么判断当前网络环境
本篇文章为大家展示了iOS中怎么判断当前网络环境,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所...
-
iOS中怎么改变UIBarButtonItem的大小
今天就跟大家聊聊有关iOS中怎么改变UIBarButtonItem的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结...