您好,登錄后才能下訂單哦!
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í)。
免責(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)容。