返回顶部
首页 > 资讯 > 移动开发 >如何在iOS上使用MVVM进行路由详解
  • 386
分享到

如何在iOS上使用MVVM进行路由详解

iosmvvm路由 2022-05-25 11:05:58 386人浏览 泡泡鱼
摘要

前言 我已经在几个项目中使用MVVM了一段时间,我真的很喜欢它的简单性。特别是,如果你像许多人一样从mvc迁移,你只需要在你的架构中增加一层ViewModel。如果您发现太多层级造成

前言

我已经在几个项目中使用MVVM了一段时间,我真的很喜欢它的简单性。特别是,如果你像许多人一样从mvc迁移,你只需要在你的架构中增加一层ViewModel。如果您发现太多层级造成的复杂,这确实使事情变得更容易。

这是一个良好的开端,但这种简单并不总是好的。在MVVM中,您将业务逻辑移出视图控制器(VC),然后意识到它仍然很胖。视图模型(VM)现在具有业务逻辑,但是展示数据(格式化)或路由如何?他们仍然被困在VC中,我们需要将它们移出。

#示例流程

假设我们正在实现登陆页面,如下所示。

##路由列表:

  • 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.
  }
 }
}

总结

  • 我们完全将路由代码移出VC。这有利于分离关注点。如果路由逻辑发生变化,您只需编辑路由器,而不是在VC中搜索push / present语句。
  • 随着时间的推移,您将需要进行许多设计更改。因此,保持视图控制器轻量化是很重要的,因为它与视图紧密耦合的。在进行UI大修时,您不希望破坏路由逻辑。
  • 你不能用这种方法来使用故事板segue。我不知道我是否伤了你的心,但你不能用segues实现这样的动态流程。故事板应该只对布局负责(同样,关注点分离)

示例代码:Movies (本地下载

谢谢你的阅读!

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。

--结束END--

本文标题: 如何在iOS上使用MVVM进行路由详解

本文链接: https://lsjlt.com/news/30238.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在iOS上使用MVVM进行路由详解
    前言 我已经在几个项目中使用MVVM了一段时间,我真的很喜欢它的简单性。特别是,如果你像许多人一样从MVC迁移,你只需要在你的架构中增加一层ViewModel。如果您发现太多层级造成...
    99+
    2022-05-25
    ios mvvm 路由
  • Flutter使用pushpop方法及路由进行导航详解
    目录正文准备工作第一种导航方式第二种导航方式正文 在 Web/Mobile 应用程序中,导航是一个很重要的特性,因为它允许你从一个页面跳转到另一个页面。 在 flutter 应用程序...
    99+
    2024-04-02
  • Vue3如何使用Vue-Router进行路由控制
    目录1.安装Vue-router3.固定路由跳转4.动态路由跳转5. vue-router配置文件6.在代码中控制路由跳转1.安装Vue-router 传送门:官方文档 yarn a...
    99+
    2024-04-02
  • php如何使用Symfony Route组件进行URL路由?
    随着互联网技术的不断发展,Web应用程序成为了当今互联网世界的重要组成部分。在Web应用程序开发过程中,URL路由是一个非常重要的概念。正确的URL路由设计可以对SEO优化、网站性能以...
    99+
    2024-04-02
  • vue在.js文件中如何进行路由跳转
    目录vue在.js文件中进行路由跳转在ts/js文件中跳转路由写法(不是在vue文件中跳转路由)vue在.js文件中进行路由跳转 我们在.vue文件中js跳转路由是this.$rou...
    99+
    2022-12-08
    js路由跳转 vue路由跳转 js文件路由跳转
  • 如何在IOS上使用ReplayKit与RTC
    在日益繁多的直播场景中,如果你也是某位游戏主播的粉丝的话,有一种直播方式是你一定不陌生的,那就是我们今天要聊的屏幕分享。 直播场景下的屏幕分享,不仅要将当前显示器所展示的画面分享给远...
    99+
    2022-06-03
    IOS 音频 视频 ReplayKit RTC
  • 如何在Linux上使用.NET进行开发
    本篇内容主要讲解“如何在Linux上使用.NET进行开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Linux上使用.NET进行开发”吧!如何安装 .NET.NET 下载被分为多个包:一...
    99+
    2023-06-16
  • 如何在LeetCode上使用Java进行打包?
    LeetCode是一个非常流行的在线编程平台,它提供了各种算法题和数据结构题目,供开发人员进行练习和挑战。而Java作为一种广泛使用的编程语言,也是LeetCode上使用最广泛的语言之一。在这篇文章中,我将向您展示如何在LeetCode上使...
    99+
    2023-07-30
    npm leetcode 打包
  • 如何使用Go进行iOS和Android编程
    这篇文章主要讲解了“如何使用Go进行iOS和Android编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Go进行iOS和Android编程”吧!...
    99+
    2024-04-02
  • 在Ubuntu中如何查看网络路由表详解
    什么是linux中的路由和路由表? 路由的过程意味着IP包在网络上从一点传输到另一点。当你向某人发送电子邮件时,你实际上是在将一系列IP数据包或数据报从你的系统传输到另一个人的计算机上。从计算机发送的数据包通过几个网关...
    99+
    2022-06-04
    ubuntu查看路由表 ubuntu查看网络配置 ubuntu 网络查看命令
  • 如何在Linux上使用Django进行Python开发?
    Linux是程序员们最喜欢的操作系统之一,它提供了强大的命令行工具和稳定的运行环境。而Python则是一种非常流行的编程语言,由于其简单易学和高效性,越来越多的程序员开始使用Python进行开发。而Django则是Python的一个非常流行...
    99+
    2023-06-17
    linux django 开发技术
  • 如何在Linux上使用Java IDE进行编程?
    在Linux上使用Java IDE进行编程是程序员们常见的操作,Java IDE可以帮助程序员更加高效地编写Java代码。在本文中,我们将介绍如何在Linux上使用Java IDE进行编程,以及如何使用一些常用的Java IDE来提高编程效...
    99+
    2023-06-01
    linux ide 学习笔记
  • 如何在 Windows 上使用 Go IDE 进行编程?
    Go语言是一种非常流行的编程语言,它的简洁性和高效性使其成为了许多开发者的首选。对于Windows用户来说,在Windows上使用Go IDE进行编程是一种非常便捷的方式。在本文中,我们将介绍如何在Windows上使用Go IDE进行编程,...
    99+
    2023-08-25
    ide windows 教程
  • vue如何在store仓库中使用路由
    目录在store仓库中使用路由在js文件中使用vue的router和store在store仓库中使用路由 在仓库中,this的指向指的是store,但是在一般的工程,我们有可能会需要...
    99+
    2024-04-02
  • 如何在 iOS 17 上使用待机模式
    您是否已准备好 unleashing the potential of iPhone through iOS 17 With its included features, your life will be made easier.。其中一...
    99+
    2023-08-02
  • 如何在iOS 17上使用个人语音
    iOS 17:如何使用个人语音苹果iPhone的辅助功能使有特殊需求的人更容易使用该设备。为了与这一策略保持一致,Apple正在iOS 17中引入另一项称为“个人语音”的功能,这对于有可能失去声音或说话能力的人来说非常有益。您可以使用此工具...
    99+
    2023-07-16
  • 如何在LeetCode中使用PHP进行路径重定向?
    LeetCode是一款用于算法练习和面试准备的在线平台,它提供了各种算法和数据结构题目。在使用LeetCode时,我们经常需要进行路径重定向,以便在不同的页面之间进行导航。本文将介绍如何在LeetCode中使用PHP进行路径重定向。 一、什...
    99+
    2023-06-01
    path 重定向 leetcode
  • 如何在阿里云服务器上设置路由器步骤详细解析
    在现代生活中,我们越来越依赖互联网来完成各种任务,例如远程工作、学习、娱乐等。为了使这些任务更流畅,我们通常需要一个稳定的网络连接。这时,路由器的作用就显得尤为重要。但是,如果你的服务器是在阿里云上,那么如何在服务器上设置路由器呢?本文将详...
    99+
    2023-11-22
    阿里 路由器 步骤
  • 如何在 LeetCode 上使用 PHP 进行编程挑战?
    LeetCode 是一个非常受欢迎的在线编程挑战平台,它提供了各种各样的算法和数据结构题目,以及面试题目,以帮助开发人员提高他们的编程技能。在本文中,我们将探讨如何在 LeetCode 上使用 PHP 进行编程挑战。 一、注册 LeetC...
    99+
    2023-09-29
    npm leetcode 重定向
  • 如何在 Unix 上使用 Go 进行代码索引?
    在 Unix 上使用 Go 进行代码索引可以提高代码的可读性和可维护性,使代码更易于理解和修改。本文将介绍如何在 Unix 上使用 Go 进行代码索引。 一、Go 介绍 Go 是一种开源的编程语言,由 Google 在2007年开始开发,于...
    99+
    2023-08-26
    unix ide 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作