iOS中保持TableView代碼整潔和結(jié)構(gòu)清晰的方法
導(dǎo)語
TableView 是iOS app 中最常用的控件,許多代碼直接或者間接的關(guān)聯(lián)到table view任務(wù)中,包括提供數(shù)據(jù)、更新tableView、控制tableView行為等等。下面會提供保持tableView代碼整潔和結(jié)構(gòu)清晰的方法。
UITableViewController vs. UIViewController
TableViewController的特性
table view controllers可以讀取table view的數(shù)據(jù)、設(shè)置tabvleView的編輯模式、反應(yīng)鍵盤通知等等。同時Table view controller能夠通過使用UIRefreshControl來支持“下拉刷新”。
Child View Controllers
tableViewController也可以作為child view controller添加到其他的viewController中,然后tableViewController會繼續(xù)管理tableView,而parentViewController能管理其他我們關(guān)心的東西。
{
DetailViewController *detail = [DetailViewController new];
[detail setup];
detail.delegate = self;
[self addChildViewController:detail];
[detail setupView];
[self.view addSubview:detail.view];
[detail didMoveToParentViewController:self];
}
如果在使用以上代碼時,需要建立child View controller 和 parent view controller之間的聯(lián)系。比如,如果用戶選擇了一個tableView里的cell,parentViewController需要知道這件事以便能夠響應(yīng)點(diǎn)擊時間。所以最好的方法是table view controller定義一個協(xié)議,同時parent view controller實現(xiàn)這個協(xié)議。
@protocol DetailViewControllerDelegate
-(void)didSelectCell;
@end
@interface ParentViewController () 《DetailViewControllerDelegate》
@end
@implementation ParentViewController
//。。.。
-(void)didSelectCell
{
//do something.。。
}
@end
雖然這樣會導(dǎo)致view controller之間的頻繁交流,但是這樣保證了代碼的低耦合和復(fù)用性。
分散代碼
在處理tableView的時候,會有各種各樣不同的,跨越model層、controller層、view層的任務(wù)。所以很有必要把這些不同的代碼分散開,防止viewController成為處理這些問題的“堆填區(qū)”。盡可能的獨(dú)立這些代碼,能夠使代碼的可讀性更好,擁有更好的可維護(hù)性與測試性。
這部分的內(nèi)容可以參考《iOS開發(fā) 簡化view controller》,而在tableView這一章中,將會專注于如何分離view和viewController
消除ModelObeject和Cell之間的隔閡
在很多情況下,我們需要提交我們想要在view層展示的數(shù)據(jù),同時我們也行維持view層和model層的分離,所以tableView中的dateSource常常做了超額的工作:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Cell *cell = [tableView dequeueReusableCellWithIdentifier:@“Cell”];
[cell setup];
NSString *text = self.title;
cell.label.text = text;
UIImage *photo = [UIImage imageWithName:text];
cell.photoView.image = photo;
}
這樣dataSorce會變得很雜亂,應(yīng)該將這些東西分到cell的category中。
@implementation Cell (ConfigText)
-(void)configCellWithTitle:(NSString *)title
{
self.label.text = title;
UIImage *photo = [UIImage imageWithName:title];
cell.photoView.image = photo;
return cell;
}
這樣的話dataSource將會變得十分簡單。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Cell *cell = [tableView dequeueReusableCellWithIdentifier:@“Cell”];
[cell configCellWithTitle:self.title];
return cell;
}
復(fù)用cell
其實還可以更進(jìn)一步,讓同一個cell變得可以展示多種的modelObject。首先需要在cell中定義一個協(xié)議,想要在這個cell中展示的object必須遵守這個協(xié)議。然后可以修改分類中config method來讓object來遵守這個協(xié)議,這樣cell就能適應(yīng)不同的數(shù)據(jù)類型。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
iOS中保持TableView代碼整潔和結(jié)構(gòu)清晰的方法下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問題? 377
- 華為全新鴻蒙蓄勢待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋果手機(jī)系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬部;消息稱 MiOS 僅限國內(nèi),小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過熱 216
- Testin云測兼容和真機(jī)服務(wù)平臺中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國產(chǎn)飛騰騰銳D2000芯片的開源BIOS固件版本 448