189 8069 5689

iOS中怎么利用MVVM实现路由

iOS中怎么利用MVVM实现路由,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创新互联主要从事网站设计制作、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务常熟,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575

##路由列表:

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


当前题目:iOS中怎么利用MVVM实现路由
转载源于:http://cdxtjz.cn/article/ihsgso.html

其他资讯