iOS中怎么利用MVVM实现路由
创始人
2024-12-19 19:22:32
0次

##路由列表:

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...