【iOS設計模式】深入理解MVC架構 - 重構你的第一個App

目錄

一、MVC模式概述

二、創建Model層

1. 新建Person模型類

2. 實現Person類

三、重構ViewController

1. 修改ViewController.h

2. 重構ViewController.m

四、MVC組件詳解

1. Model(Person類)

2. View(Storyboard中的UI元素)

3. Controller(ViewController)

五、MVC數據流分析

六、MVC最佳實踐

七、擴展練習

八、常見問題解答

九、總結

相關推薦


一、MVC模式概述

MVC(Model-View-Controller)是Apple官方推薦的iOS應用架構模式,它將應用程序分為三個核心組件:

  1. Model(模型):負責數據和業務邏輯
  2. View(視圖):負責用戶界面展示
  3. Controller(控制器):作為中介協調Model和View

二、創建Model層

讓我們為上篇教程的App創建一個簡單的Model。

1. 新建Person模型類

  1. 右鍵點擊項目導航器中的HelloUIKit文件夾
  2. 選擇"New File…"
  3. 選擇"Objective-C class",點擊Next
  4. 類名輸入Person,父類保持NSObject
  5. 點擊Create

2. 實現Person類

修改Person.h文件:

#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger tapCount;- (instancetype)initWithName:(NSString *)name;
- (NSString *)greetingMessage;@end

修改Person.m文件:

#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name {self = [super init];if (self) {_name = [name copy];_tapCount = 0;}return self;
}- (NSString *)greetingMessage {return [NSString stringWithFormat:@"%@被點擊了%ld次", self.name, (long)self.tapCount];
}@end

三、重構ViewController

現在我們來重構ViewController,使其符合MVC架構。

1. 修改ViewController.h

#import <UIKit/UIKit.h>
#import "Person.h"@interface ViewController : UIViewController@property (nonatomic, strong) Person *user;  // Model
@property (weak, nonatomic) IBOutlet UILabel *helloLabel;  // View
- (IBAction)buttonTapped:(id)sender;  // Controller action@end

2. 重構ViewController.m

#import "ViewController.h"@interface ViewController ()
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 初始化Modelself.user = [[Person alloc] initWithName:@"iOS開發者"];// 初始化UI狀態[self updateUI];
}- (void)updateUI {// 根據Model更新Viewself.helloLabel.text = [self.user greetingMessage];
}- (IBAction)buttonTapped:(id)sender {// 更新Modelself.user.tapCount++;// 根據新Model狀態更新View[self updateUI];// 更新按鈕狀態[sender setTitle:@"再點一次" forState:UIControlStateNormal];// 改變背景色CGFloat hue = (arc4random() % 256 / 256.0);self.view.backgroundColor = [UIColor colorWithHue:hue saturation:0.7 brightness:1.0 alpha:1.0];
}@end

四、MVC組件詳解

1. Model(Person類)

  • 包含應用數據和業務邏輯
  • 完全獨立于UI
  • 提供數據訪問和操作方法
  • 示例中greetingMessage方法封裝了消息生成邏輯

2. View(Storyboard中的UI元素)

  • 負責展示數據和接收用戶輸入
  • 不直接與Model交互
  • 通過IBOutlet暴露給Controller
  • 保持被動,由Controller更新

3. Controller(ViewController)

  • 協調Model和View之間的數據流
  • 職責包括:
    • 初始化Model和View (viewDidLoad)
    • 響應View事件 (buttonTapped:)
    • 更新Model (self.user.tapCount++)
    • 根據Model更新View (updateUI方法)
    • 管理View生命周期

五、MVC數據流分析

  1. 用戶點擊按鈕:View觸發buttonTapped:事件
  2. Controller處理
    • 更新Model (tapCount++)
    • 調用updateUI方法
  3. 更新View
    • Controller從Model獲取數據
    • Controller更新Label顯示

這樣實現了單向數據流,各組件職責明確。

六、MVC最佳實踐

  1. 保持Model獨立

    • Model不應導入UIKit
    • 只包含數據和業務邏輯
  2. 保持View被動

    • View不應直接訪問Model
    • 通過Controller更新狀態
  3. 避免Massive View Controller

    • 將復雜業務邏輯抽離到Model或獨立類
    • 使用updateUI方法集中管理界面更新

七、擴展練習

為了更好理解MVC,嘗試以下擴展:

  1. 為Person類添加更多屬性(如年齡、職業)
  2. 修改greetingMessage方法返回更豐富的信息
  3. 添加重置按鈕,將tapCount歸零
  4. 創建SettingsViewController來修改Person的name屬性

八、常見問題解答

Q:為什么Model不能直接更新View?
A:這會破壞MVC的分離原則,導致代碼難以維護和測試。

Q:所有UI更新都要放在updateUI方法中嗎?
A:最佳實踐是集中管理UI更新,但對于復雜界面可以按功能拆分多個更新方法。

Q:小型項目也需要嚴格MVC嗎?
A:即使是小型項目,遵守MVC也能提高代碼可維護性,建議從一開始就養成好習慣。

九、總結

通過本次重構,你學會了:

  1. 如何創建獨立的Model層
  2. 嚴格分離Model、View和Controller
  3. Controller作為協調者的正確職責
  4. 實現單向數據流
  5. MVC各組件之間的通信方式

MVC是iOS開發的基石,掌握它將為你后續學習更復雜的架構(如MVVM、VIPER)打下堅實基礎。

相關推薦

Objective-C UI事件處理全解析-CSDN博客文章瀏覽閱讀1.7k次,點贊68次,收藏56次。本文全面解析iOS應用開發中的UI事件處理機制,涵蓋響應者鏈、觸摸事件和手勢識別三大核心內容。首先詳細介紹了響應者鏈的工作原理及其構成,包括UIResponder的關鍵方法。其次講解了觸摸事件處理的基礎實現和多點觸控技術,并演示了拖拽功能的實現。最后深入解析了UIGestureRecognizer的使用方法,包括系統提供的手勢識別器、狀態管理以及捏合縮放等高級功能的實現。文章還提供了UIControl事件機制、自定義事件傳遞等高級技巧,并給出性能優化建議和實用調試方法。 https://shuaici.blog.csdn.net/article/details/148784934讓界面活起來:Objective-C中的UI動畫實現-CSDN博客文章瀏覽閱讀714次,點贊24次,收藏31次。這篇教程詳細介紹了iOS開發中Objective-C實現UI動畫的方法。主要內容包括:1.UIView基礎動畫實現,展示透明度、位置等屬性變化的簡單API;2.CoreAnimation的核心技術,講解CALayer屬性操作和關鍵幀動畫;3.轉場動畫和iOS7引入的彈簧動畫效果;4.動畫性能優化技巧和調試方法;5.綜合動畫示例和常用代碼片段。教程從基礎到進階,全面覆蓋iOS動畫開發技術,強調在實際應用中應保持動畫簡潔性、一致性和性能優化,為開發者提供了完整的動畫實現解決方案。 https://shuaici.blog.csdn.net/article/details/148784474

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90537.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端項目集成lint-staged

lint-staged (lint-staged) 這個插件可以只針對進入git暫存區中的代碼進行代碼格式檢查與修復&#xff0c;極大提升效率&#xff0c;避免掃描整個項目文件&#xff0c;代碼風格控制 eslint prettier stylelint 看這兩篇文章 前端項目vue3項目集成eslint9.x跟prettier 前端項…

李宏毅genai筆記:模型編輯

0 和post training的區別直接用post training的方法是有挑戰的&#xff0c;因為通常訓練資料只有一筆而且之后不管問什么問題&#xff0c;都有可能只是這個答案了1 模型編輯的評估方案 reliability——同樣的問題&#xff0c;需要是目標答案generalization——問題&#xff08;…

Oracle:union all和union區別

UNION ALL和UNION在Oracle中的主要區別體現在處理重復記錄、性能及結果排序上&#xff1a;處理重復記錄?UNION?&#xff1a;自動去除重復記錄&#xff0c;確保最終結果唯一。?UNION ALL?&#xff1a;保留所有記錄&#xff0c;包括完全重復的行。性能表現?UNION?&#xff…

[C#/.NET] 內網開發中如何使用 System.Text.Json 實現 JSON 解析(無需 NuGet)

在實際的企業開發環境中&#xff0c;尤其是內網隔離環境&#xff0c;開發人員經常面臨無法使用 NuGet 安裝外部包的問題。對于基于 .NET Framework 4.8 的應用&#xff0c;JSON 解析是一個常見的需求&#xff0c;但初始項目中往往未包含任何 JSON 處理相關的程序集。這時&#…

JVM(Java 虛擬機)的介紹

JVM原理JVM 核心架構與工作流程1. 類加載機制&#xff08;Class Loading&#xff09;2. 運行時數據區&#xff08;Runtime Data Areas&#xff09;堆&#xff08;Heap&#xff09;方法區&#xff08;Method Area&#xff09;:元空間&#xff08;Metaspace&#xff09;公共區域虛…

Qt 信號槽的擴展知識

Qt 信號槽的擴展知識一、信號與槽的重載Qt信號與槽的重載問題注意事項示例場景二、一個信號連接多個槽1、直接連接多個槽2、使用lambda表達式連接3、連接順序控制4、斷開特定連接5、自動連接方式三、 多個信號連接一個槽基本連接語法使用QSignalMapper區分信號源&#xff08;Qt…

鏈表算法之【合并兩個有序鏈表】

目錄 LeetCode-21題 LeetCode-21題 將兩個升序鏈表合并成一個新的升序鏈表并返回 class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if (list1 null)return list2;if (list2 null)return list1;ListNode dummyHead new ListNode();ListN…

Linux - firewall 防火墻

&#x1f525; 什么是 firewalld&#xff1f;firewalld 是一個動態管理防火墻的守護進程&#xff08;daemon&#xff09;&#xff0c;它提供了一個 D-Bus 接口來管理系統或用戶的防火墻規則。與傳統的靜態 iptables 不同&#xff0c;firewalld 支持&#xff1a;區域&#xff08…

【GESP】C++二級真題 luogu-B4356 [GESP202506 二級] 數三角形

GESP C二級&#xff0c;2025年6月真題&#xff0c;多重循環&#xff0c;難度★?☆☆☆。 題目題解詳見&#xff1a;【GESP】C二級真題 luogu-B4356 [GESP202506 二級] 數三角形 | OneCoder 【GESP】C二級真題 luogu-B4356 [GESP202506 二級] 數三角形 | OneCoderGESP C二級&…

遙感影像巖性分類:基于CNN與CNN-EL集成學習的深度學習方法

遙感影像巖性分類&#xff1a;基于CNN與CNN-EL集成學習的深度學習方法 大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下遙感影像巖性分類&#xff1a;基于CNN與CNN-EL集成學習的深度學習方法。該方法充分利用了多源遙感數據的光譜和空間信息&#xff0c;同時結合…

【STM32 學習筆記】SPI通信協議

SPI通信協議 SPI協議是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interface)&#xff0c;即串行外圍設備接口&#xff0c; 是一種高速全雙工的通信總線。它被廣泛地使用在ADC、LCD等設備與MCU間&#xff0c;要求通訊速率較高的場合。 ??學習本章時&#xff0c;可與I2C…

Kafka如何做到消息不丟失

一、三種消息傳遞語義(Message Delivery Semantics):核心是“消息被消費處理的次數” Kafka的三種傳遞語義本質上描述的是“一條消息從生產到最終被消費者處理完成,可能出現的次數”,這由生產者的消息寫入可靠性和消費者的offset提交策略共同決定。 1. At most once(最…

HEVC/H.265 碼流分析工具 HEVCESBrowser 使用教程

引言 研究視頻編解碼的都知道&#xff0c;少不了各類的分析工具助力標準研究和算法開發&#xff0c;目前最出名的流媒體分析工具就是elecard系列&#xff0c;但基于一些原因可能大家用的都比較少。因此&#xff0c;找到合適的碼流分析工具才是編解碼研究的便捷途徑&#xff0c…

量子計算+AI芯片:光子計算如何重構神經網絡硬件生態

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 量子計算AI芯片&#xff1a;光子計算如何重構神經網絡硬件生態 ——2025年超異構計算架構下的萬億參數模型訓練革命 產業拐點&a…

linux 4.14 kernel屏蔽arm arch timer的方法

在 ARMv7 架構的單核 CPU 系統中&#xff0c;完全禁用 coretime 時鐘中斷&#xff08;通常是 ARM 私有定時器中斷&#xff09;需要謹慎操作&#xff0c;因為這會導致調度器無法工作&#xff0c;系統可能失去響應。以下是實現方法及注意事項&#xff1a;方法 1&#xff1a;通過 …

[實戰]調頻(FM)和調幅(AM)信號生成(完整C語言實現)

調頻&#xff08;FM&#xff09;和調幅&#xff08;AM&#xff09;信號生成 文章目錄調頻&#xff08;FM&#xff09;和調幅&#xff08;AM&#xff09;信號生成1. 調頻&#xff08;FM&#xff09;和調幅&#xff08;AM&#xff09;信號原理與信號生成調幅&#xff08;AM&#…

【LeetCode 熱題 100】21. 合并兩個有序鏈表——(解法一)迭代法

Problem: 21. 合并兩個有序鏈表 題目&#xff1a;將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(M N)空間復雜度&#xff1a;O(1)整體思路 這段代碼旨在解決…

力扣 hot100 Day40

23. 合并 K 個升序鏈表 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表中&#xff0c;返回合并后的鏈表。 //自己寫的垃圾 class Solution { public:ListNode* mergeKLists(vector<ListNode*>& lists) {vector<int…

validate CRI v1 image API for endpoint “unix:///run/containerd/containerd.sock“

1.現象pull image failed: Failed to exec command: sudo -E /bin/bash -c "env PATH$PATH crictl pull 172.23.123.117:8443/kubesphereio/pause:3.9"FATA[0000] validate service connection: validate CRI v1 image API for endpoint "unix:///run/container…

【會員專享數據】2013-2024年我國省市縣三級逐月SO?數值數據(Shp/Excel格式)

之前我們分享過2013-2024年全國范圍逐月SO?柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;!該數據來源于韋晶博士、李占清教授團隊發布在國家青藏高原科學數據中心網站上的中國高分辨率高質量近地表空氣污染物數據集。很多小伙伴拿到數據后反饋柵格數據不太方便使…