iOS中怎么利用MVVM实现路由

发布时间:2021-07-24 15:36:31 作者:Leah
来源:亿速云 阅读:143

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实现路由问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. iOS中基于协议的路由设计
  2. 利用单臂路由实现vlan间路由

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ios mvvm

上一篇:spring中怎么利用FactoryBean配置Bean

下一篇:Mybatis中怎么实现SQL防注入

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》