1. 程式人生 > >【iOS開發】深入MVC---UITableView的資料來源方法封裝

【iOS開發】深入MVC---UITableView的資料來源方法封裝

一、在iOS開發中,MVC模式是再經典不過的了,本文將從tableview的使用以及自定義cell結合來感受MVC設計模式。

1、在ZPMainController.m檔案中

(1)通過懶載入獲取到模型資料,儲存到陣列helps中

<span style="font-size:18px;">/**
 *  懶載入模型資料
 */
-(NSArray *)helps
{
    
    if (_helps == nil) {
        _helps = [ZPHelp helpArray];
    }
    return _helps;
}</span>
(2)然後只需要在viewDidLoad中呼叫這個方法
<span style="font-size:18px;">- (void)setupTableView
{
    
    myBlock configureCell = ^(ZPTableViewCell *cell, ZPHelp *model) {
        //使用分類方法
        [cell setDataForCell:model];
    };
    
    self.ZPArrayDataSource = [[ZPTableViewDataSource alloc] initWithItemArray:self.helps identifier:ID block:configureCell];
    self.tableView.dataSource = self.ZPArrayDataSource;
}</span>

2、在ZPTableViewDataSource類中

(1).h檔案

/**
 *  定義一個block,用於接收外界傳入引數,內部處理
 *
 *  @param cell tableview的cell
 *  @param item 模型資料物件
 */
typedef void (^myBlock)(id cell,id item);
//重寫init方法,攔截該類建立,做對應操作
- (instancetype)initWithItemArray:(NSArray *)itemArray identifier:(NSString *)identifier block:(myBlock)myBlock;
(2).m檔案,實現資料來源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.itemArr.count;
    
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ZPTableViewCell *cell = [ZPTableViewCell cellWithTableView:tableView identifier:self.identifier];

    ZPHelp *model = self.itemArr[indexPath.row];
    
    //執行block中封裝的自定義cell設定資料的方法
    self.myBlock(cell,model);
    
    return cell;
}

3、在自定義cell類.h檔案中
//開放內部子控制元件,給外界模型設定屬性值
@property(nonatomic ,weak)UILabel *titleL ;
@property(nonatomic ,weak)UILabel *urlL ;
@property(nonatomic ,weak)UILabel *IDL ;

///  提供快速建立自定義cell的方法
+ (instancetype)cellWithTableView:(UITableView *)tableView identifier:(NSString *)identifier;

4、在自定義cell類的.h檔案分類中
///  給自定義的cell新增分類方法,設定cell內部屬性
///  @param model 傳遞模型
- (void)setDataForCell:(ZPHelp *)model;

5、結合模型類ZPHelp,就可以完成M(model)- V(view)- C(controller)之間的資料傳遞,從而更新UI介面。

二、總結:

1、很大程度上減少了控制器的負擔,可以更專心處理業務邏輯

2、符合MVC模式真正原則,model只負責處理資料,view只負責顯示資料,controller負責處理業務邏輯

3、優化程式碼結構,結構清晰,符合面向物件的封裝思想。

【by:Leo_zzp,支援原創,轉載請說明出處!】 個人郵箱:[email protected]GitHub連結:MrLeoZou,期待您的交流!

相關推薦

iOS開發深入MVC---UITableView資料來源方法封裝

一、在iOS開發中,MVC模式是再經典不過的了,本文將從tableview的使用以及自定義cell結合來感受MVC設計模式。 1、在ZPMainController.m檔案中 (1)通過懶載入獲取到模型資料,儲存到陣列helps中 <span style="font

iOS開發iOS移動端架構

引言:一個app的初始階段,必然是先滿足各種業務需求。然後,經過多次版本迭代之後,先前的由於急於滿足需求而導致的雜亂程式碼則會充斥整個專案。而此時,專案有了一定的規模,有了一定數量的開發人員,那麼為了達到快速迭代版本的需求,則是需要有一個強大的架構來支撐。

iOS開發Gitlab教程 (一)

一 、gitLab 建立工程 Project name : 工程名字起一個,最好和專案相關; Namespace : 你自己的gitLab工作空間,預設就好; Description : 描述,隨便寫。 Visibi

iOS開發判斷app啟動的方式(launchOptions)

iOS app啟動的方式有哪些: 自己啟動(使用者手動點選啟動)urlscheme啟動(關於urlScheme的詳解點選開啟連結)本地通知啟動  (自己寫的本地通知啟動,藍芽模組的啟動,地理圍欄的啟動)遠端通知啟動    (後臺伺服器的推送通知)在appdelegate.m

iOS開發SEL和Selector 原理小結

一 、Selector(選擇器)簡介 選擇器是用來選擇一個方法來為一個物件 執行的名稱,或是在編譯原始碼時替換該名稱的 唯一識別符號的名稱。一個選擇器本身不做任何事情。它簡單地識別了一種方法。唯一使選擇器的方法名稱不同於普通字串,編譯器確保選擇器是獨特的。

iOS開發一些常見的警告解決方案(更新中。。。)

Unknown pattern color for the Background Color attribute 1.背景色屬性為未知模式的顏色 解決:預設xib裡面控制元件的背景色為Default。如果出現警告,可能是你定義的顏色Xcode啟動

iOS開發UIWebView載入html時不顯示網路圖片解決辦法

NSString *html = @"<html><body><p>怎麼顯示網路圖片 <img src=\"http://p0.ifengimg.com/pmop/2017/1218/F9636BB16CC72EC34B5FCB78

APP內開啟另一個APP(URL Scheme與openURL)iOS開發

目標 平常我們做iOS開發,會經常遇到開啟其他的APP的功能。本篇文章講的就是開啟別人的APP的一些知識。我們的目標是: 開啟別人的APP讓別人開啟我們的APPiOS9的適配問題使用URL Schemes傳遞資料 準備工作 建立一個名為OpenApp的工作空間,用來存放

iOS開發陣列的去重(無序和有序)

一、 無序的去重 1.利用NSDictionary的AllKeys(AllValues)方法 可以將NSArray中的元素存入一個字典,然後利用AllKeys或者AllValues取得字典的所有鍵或值,這些鍵或值都是去重的。 程式碼:

iOS開發---- tableView背景隨表滾動

        最近專案中用到了“圖隨表動”,如下圖所示:         這是一個訂單,需要add shipping insurance以上的部分隨著表格的滾動而滾動,這裡表格是group型別的,所以背景加在cell上是達不到效果的,在code4App上找到了一個例子(

iOS開發---- 語音識別

        最近iOS專案中需要用到語音識別技術(也被稱為自動語音識別,英語:Automatic Speech Recognition, ASR)。去google搜尋了一下,發現語音識別做的不錯的

IOS 開發Object

.一. 類定義類定義需要實現兩部分 : -- 介面部分 : 定義類的成員變數和方法, 方法是抽象的, 在標頭檔案中定義;-- 實現部分 : 引入介面部分的標頭檔案, 實現抽象方法;1. 介面部分定義 (

iOS開發UIView(包括子類)的幾個初始化方法

-(id)initWithFrame:(CGRect)frame UIView的指定初始化方法; 總是傳送給UIView去初始化, 除非是從一個nib檔案中載入的; -(id

iOS開發NSThread

 atomic    原子屬性,是預設屬性     * 是在多執行緒開發時,保證多個執行緒在"寫入"的時候,能夠保證只有一條執行緒執行寫入操作!     * 是一個單(執行緒)寫多(執行緒)讀的多執行緒技術     * 原子屬性,解決不了賣票問題,因為賣票的讀寫都需要鎖定

iOS開發launch Images啟動圖片設定(UILaunchImageFile)之002

一、實現效果: 通過直接給圖片起預設的名字,讓app啟動頁自動載入啟動圖片。 二、注意點: ·圖片命名一定要按蘋果官方的指定規則命名,圖片的畫素也要符合規則; ·如果橫豎屏圖片都需要,記得在Xcode中勾選上專案支援橫豎屏。 三、官方描述:

iOS 開發將自己的框架打包成 Framework 的方法

建立 Framework 工程1. 建立打包工程開啟 Xcode 新建一個工程,選擇 Framework & Libray 選項中的 Cocoa Touch Framework ,這裡說一下我的 Xcode 版本是 8.3.2 。建立工程因為要打包所需的檔案,所以這裡我自己建立了一個測試類,在實際的打

iOS開發 常遇到的Crash和Bug處理

七:pngcrush caught libpng error,Not a PNG file Could not find file While reading /XXX/XXX/XXX/img1.png pngcrush caught libpng error:   Not a PNG filCou

iOS開發---- 手把手教你github託管程式碼

       在csdn上還有一篇介紹如何使用github託管程式碼的: 兩分鐘學會在GitHub託管程式碼。我照著這個教程嘗試了一遍,發現程式碼並沒有託管上去,只是建立了一個存放程式碼的倉庫(re

iOS 開發Status Bar 狀態列設定彙總

狀態列 個人覺得 iOS 的 Status Bar 狀態列也是一個比較坑的地方,所以還是寫一個總結,有遇到這方面問題的朋友可以看一下。 Status Bar 狀態列的隱藏 1. 通過設定 Info.plist 檔案實現狀態列的全域性隱藏 在 Info.pl

iOS開發深入理解UITableView的cell複用原理

簡介 在我們的日常開發中,絕大多數情況下只要詳細閱讀類標頭檔案裡的註釋,組合UIKit框架裡的大量控制元件就能很好的滿足工作的需求。但僅僅會使用UIKit裡的控制元件還遠遠不夠,假如現在產品需要一個類似 Excel 樣式的控制元件來呈現資料,需要這個控制元件能上下左右滑