<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MVVMR on Joe's Blog</title><link>https://shinrenpan.github.io/tags/mvvmr/</link><description>Recent content in MVVMR on Joe's Blog</description><generator>Hugo</generator><language>zh-tw</language><copyright>© Shinren Pan. All rights reserved.</copyright><lastBuildDate>Sun, 28 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://shinrenpan.github.io/tags/mvvmr/index.xml" rel="self" type="application/rss+xml"/><item><title>如果用 Pure SwiftUI 來實作 MVVMC</title><link>https://shinrenpan.github.io/2026-06-28/</link><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><guid>https://shinrenpan.github.io/2026-06-28/</guid><description>&lt;p&gt;&lt;a href="../2026-04-24/"&gt;之前寫過&lt;/a&gt;我為什麼自創了一套 &lt;strong&gt;MVVMC&lt;/strong&gt;：四層 M / VM / V / C，前三層管資料 / 畫面 / 邏輯，特色在那個 &lt;strong&gt;C&lt;/strong&gt;——&lt;code&gt;UIHostingController&lt;/code&gt; 把 SwiftUI View 嵌進 &lt;code&gt;UINavigationController&lt;/code&gt;，配一個集中式 &lt;code&gt;AppRouter&lt;/code&gt; 統一管導航。核心是 &lt;strong&gt;把導航還給 UIKit 管&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;那套設計的理由到今天我還是覺得對：SwiftUI 導航當年太零碎，交給穩定的 UIKit 是最務實的選擇。&lt;/p&gt;
&lt;p&gt;但這幾年 SwiftUI 導航一直在補。&lt;code&gt;NavigationStack(path:)&lt;/code&gt; 出來之後，「集中、可程式化的導航」——當年逼我逃去 UIKit 的那個核心需求——SwiftUI 自己終於給得了。於是一個問題變得值得問：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;同一套 MVVMC，改用 Pure SwiftUI 實作會長什麼樣？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;這篇就是答案，我把它叫做 &lt;strong&gt;MVVMR&lt;/strong&gt;——MVVMC 的 &lt;strong&gt;C（Controller）&lt;/strong&gt; 換成 &lt;strong&gt;R（Router）&lt;/strong&gt;：UIKit 的 &lt;code&gt;UIHostingController&lt;/code&gt; 退場，導航改用純 SwiftUI 的 Router pattern。先講定位：&lt;strong&gt;它不取代 MVVMC，是同一套架構的另一種底座&lt;/strong&gt;——M / VM 紀律、集中式導航、決策與執行分離全部一樣，只是把 C 層綁 UIKit 的部分換成純 SwiftUI。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-要換掉的其實只有一塊"&gt;🤔 要換掉的，其實只有一塊&lt;/h2&gt;
&lt;p&gt;MVVMC 四層裡，M / VM / V 本來就跟 UIKit 無關——&lt;code&gt;@Observable&lt;/code&gt;、&lt;code&gt;doAction&lt;/code&gt;、SwiftUI View，純 Swift。&lt;strong&gt;唯一綁死 UIKit 的只有 C 層&lt;/strong&gt;：&lt;code&gt;UIHostingController&lt;/code&gt;、&lt;code&gt;UINavigationController&lt;/code&gt;、自訂轉場、邊緣返回手勢。&lt;/p&gt;</description></item></channel></rss>