使用 MVVM 架構時頁面跳轉邏輯寫在哪兒仇哆?

之前我一直在 ViewModel 中處理頁面跳轉邏輯,VC 直接拿到目標頁面進行 push/present灾炭。前些天 Code Review 時茎芋,同事指出理論上 ViewModel 里不應該出現(xiàn)跟 UIKit 相關的東西。

我覺得很有道理蜈出,但我也不贊成把頁面跳轉邏輯寫到 VC 里田弥,我認為在 MVVM 中 VC 中充當了一個 ContainerView 的角色,管理 View 的生命周期铡原,做一些依賴注入之類的事情輔助 View 和 ViewModel 的綁定偷厦,它是 View 層的商叹。頁面跳轉中只有 push/present 這一步是 View 層的,其他諸如通過一些邏輯判斷該跳轉到哪個頁面只泼、跳轉之前需要做什么操作之類的代碼不該放在 View 層剖笙。

但 ViewModel 中出現(xiàn) UIKit 對象這一點也確實讓人難受,于是我用我蹩腳的英語詢問了 Rx 社區(qū)的外國友人请唱,但結果并不盡如人意:

RxCommunity1.png
RxCommunity2.png

他們向我推薦了一篇文章和一個庫弥咪,雖然并不是我想要的,但還是很感謝他們的熱心幫助十绑。第二天我自己寫了一個 Router:

typealias Completion = () -> Void

enum PageMap {
    case DemoPage1
    case DemoPage2(String)

    var vc: UIViewController {
        switch self {
        case .DemoPage:
            return DemoController1()
        case .DemoPage2(let title):
            return DemoController2(title: title)
        }
    }
}

enum Router {
    case Push(PageMap)
    case Present(PageMap)

    func go(form vc: UIViewController,
                 animated: Bool = true,
                 completion: Completion? = nil) {

        switch self {
        case .Push(let map):
            vc.navigationController?.pushViewController(map.vc, animated: animated)
        case .Present(let map):
            vc.presentViewController(map.vc, animated: animated, completion: completion)
        }
    }
}

有了這個 Router聚至,ViewModel 就可以提供 Driver<Router>,只要在 VC 里訂閱它就好本橙。

果然沒有什么問題是加一層抽象不能解決的扳躬,科科。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末勋功,一起剝皮案震驚了整個濱河市坦报,隨后出現(xiàn)的幾起案子库说,更是在濱河造成了極大的恐慌狂鞋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潜的,死亡現(xiàn)場離奇詭異骚揍,居然都是意外死亡,警方通過查閱死者的電腦和手機啰挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門信不,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亡呵,你說我怎么就攤上這事抽活。” “怎么了锰什?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵下硕,是天一觀的道長。 經常有香客問我汁胆,道長梭姓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任嫩码,我火速辦了婚禮誉尖,結果婚禮上,老公的妹妹穿的比我還像新娘铸题。我一直安慰自己铡恕,他們只是感情好琢感,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著探熔,像睡著了一般猩谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祭刚,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天牌捷,我揣著相機與錄音,去河邊找鬼涡驮。 笑死暗甥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的捉捅。 我是一名探鬼主播撤防,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棒口!你這毒婦竟也來了寄月?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤无牵,失蹤者是張志新(化名)和其女友劉穎漾肮,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體茎毁,經...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡克懊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了七蜘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭溉。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橡卤,靈堂內的尸體忽然破棺而出扮念,到底是詐尸還是另有隱情,我是刑警寧澤碧库,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布柜与,位于F島的核電站,受9級特大地震影響谈为,放射性物質發(fā)生泄漏旅挤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一伞鲫、第九天 我趴在偏房一處隱蔽的房頂上張望粘茄。 院中可真熱鬧,春花似錦、人聲如沸柒瓣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芙贫。三九已至搂鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磺平,已是汗流浹背魂仍。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拣挪,地道東北人擦酌。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像菠劝,于是被迫代替她去往敵國和親赊舶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容