溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

iOS中怎么利用MVVM實(shí)現(xiàn)路由

發(fā)布時(shí)間:2021-07-24 15:36:31 來(lái)源:億速云 閱讀:146 作者:Leah 欄目:編程語(yǔ)言

iOS中怎么利用MVVM實(shí)現(xiàn)路由,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

##路由列表:

Login > 主頁(yè)面Sign Up > 注冊(cè)頁(yè)面Forgot Password(?) > 忘記密碼頁(yè)面

這看起來(lái)像是一個(gè)簡(jiǎn)單的頁(yè)面,可以使用帶有3個(gè)segues的故事板來(lái)實(shí)現(xiàn)。但請(qǐng)相信我,事實(shí)并非如此。例如,您通常會(huì)在登錄時(shí)打開(kāi)主屏幕。但在這種情況下,用戶(hù)的密碼可能已過(guò)期,您需要實(shí)施重定向到更改密碼屏幕。所以登錄路線(xiàn)變成:

Login > 主頁(yè)面 或者 更改密碼頁(yè)面

這是故事板路由失敗的地方。它無(wú)法處理這種動(dòng)態(tài)情況。所以你通常做的是讓VC處理它:

func loginButtonTapped() { // Start network request... // Upon response: if viewModel.shouldChangePassword { performSegue(id: "ChangePasswordScreen", sender: nil) } else { performSegue(id: "HomeScreen", sender: nil) }}

這是路由邏輯,它不應(yīng)該在VC中。如果您想要輕型VC,請(qǐng)?jiān)诰帉?xiě)if語(yǔ)句之前三思而后行。他們是決定代碼,他們不屬于那里。根據(jù)我的理解,VC應(yīng)該只有視圖相關(guān)和粘合代碼。從來(lái)沒(méi)有決定代碼。讓我們定義一個(gè)路由器協(xié)議,并從VC中取出這些if語(yǔ)句。我們會(huì)需要:

路由ID:像segue ID一樣的一個(gè)字符串上下文:當(dāng)前視圖控制器是從哪里跳過(guò)來(lái)的可選的參數(shù):過(guò)渡所需的臨時(shí)數(shù)據(jù)。 (tableview點(diǎn)擊了哪一行等等)

protocol Router { func route( to routeID: String, from context: UIViewController, parameters: Any? )}

VC應(yīng)該只定義路由名稱(chēng),而不關(guān)心該路由的位置。這將是路由器的工作。

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

如上所述,登錄按鈕可以進(jìn)入主頁(yè)面或更改密碼頁(yè)面。那么路由器如何選擇正確的目的地呢?在這種情況下,您的路由器可能需要訪(fǎng)問(wèn)您的VM。這樣,它可以直接讀取業(yè)務(wù)決策并決定目的地。

請(qǐng)注意VC已經(jīng)retain了VM和路由器。因此,路由器對(duì)VM應(yīng)該是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.  } }}

關(guān)于iOS中怎么利用MVVM實(shí)現(xiàn)路由問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI