久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

iOS開發(fā) 精簡TableView

 dxw121 2017-06-06

翻譯,、修改自

原文鏈接:Clean Table View Code



導(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)鍵盤通知等等。同時(shí)Table view controller能夠通過使用UIRefreshControl來支持“下拉刷新”,。


Child View Controllers


tableViewController也可以作為child view controller添加到其他的viewController中,然后tableViewController會繼續(xù)管理tableView,,而parentViewController能管理其他我們關(guān)心的東西,。


    -(void)addDetailTableView

    {

        DetailViewController *detail = [DetailViewController new];

        [detail setup];

        detail.delegate = self;

        [self addChildViewController:detail];

        [detail setupView];

        [self.view addSubview:detail.view];

        [detail didMoveToParentViewController:self];

    }


如果在使用以上代碼時(shí),需要建立child View controller 和 parent view controller之間的聯(lián)系,。比如,,如果用戶選擇了一個(gè)tableView里的cell,parentViewController需要知道這件事以便能夠響應(yīng)點(diǎn)擊時(shí)間,。所以最好的方法是table view controller定義一個(gè)協(xié)議,,同時(shí)parent view controller實(shí)現(xiàn)這個(gè)協(xié)議。


@protocol DetailViewControllerDelegate

-(void)didSelectCell;

@end


@interface ParentViewController () <DetailViewControllerDelegate>

@end


@implementation ParentViewController

//....

-(void)didSelectCell

{

    //do something...

}

@end


雖然這樣會導(dǎo)致view controller之間的頻繁交流,,但是這樣保證了代碼的低耦合和復(fù)用性,。


分散代碼


在處理tableView的時(shí)候,會有各種各樣不同的,,跨越model層,、controller層、view層的任務(wù),。所以很有必要把這些不同的代碼分散開,,防止viewController成為處理這些問題的“堆填區(qū)”。盡可能的獨(dú)立這些代碼,,能夠使代碼的可讀性更好,,擁有更好的可維護(hù)性與測試性。


這部分的內(nèi)容可以參考《iOS開發(fā) 簡化view controller》,,而在tableView這一章中,,將會專注于如何分離view和viewController


消除ModelObeject和Cell之間的隔閡


在很多情況下,我們需要提交我們想要在view層展示的數(shù)據(jù),,同時(shí)我們也行維持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


其實(shí)還可以更進(jìn)一步,,讓同一個(gè)cell變得可以展示多種的modelObject。首先需要在cell中定義一個(gè)協(xié)議,,想要在這個(gè)cell中展示的object必須遵守這個(gè)協(xié)議,。然后可以修改分類中config method來讓object來遵守這個(gè)協(xié)議,這樣cell就能適應(yīng)不同的數(shù)據(jù)類型,。


在cell中處理cell狀態(tài)


如果想要對tableView的行為進(jìn)行設(shè)置,,如選中操作后改變高光狀態(tài)等,可以在tableViewController中使用委托方法:


-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath

{

    Cell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.label.shadowColor = [UIColor greenColor];

}


-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath

{

    Cell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.label.shadowColor = nil;

}


然而當(dāng)想要換出這些cell或者想要重新設(shè)計(jì)的時(shí)候,,仍然需要適應(yīng)委托方法,。cell里面的detail的實(shí)現(xiàn)和委托方法中對detail的實(shí)現(xiàn)交織在一起,所以應(yīng)該將這些邏輯移到cell里面:


@implementation Cell

//...

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated

{

    [super setHighlighted:highlighted animated:animated];

    if(highlighted)

    {

        self.label.shadowColor = [UIColor greenColor];

    }

    else

    {

        self.label.shadowColor = nil;

    }

}

@end


一個(gè)委托需要知道一個(gè)view的不同狀態(tài),,但它不需要知道怎么去修改view或者有哪些屬性需要設(shè)置來使這個(gè)view轉(zhuǎn)變狀態(tài),,所有的邏輯應(yīng)該又view來完成,而在外部只是僅僅提供一個(gè)API,。這樣才是view層和controller層實(shí)現(xiàn)代碼之間的有效分離,。


處理不同的cell類型


如果在一個(gè)tableView中有不同的cell類型,dataSource將會變得膨脹而難以操作,,在下面的代碼中,,有兩個(gè)不同的cell類型,一個(gè)負(fù)責(zé)展示圖片和標(biāo)題,,另一個(gè)負(fù)責(zé)展示星標(biāo),。為了分離處理不同的cell的代碼,dataSource方法只是僅僅執(zhí)行不同cell自己的設(shè)置方法,。


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    BOOL isStarRank = self.keys[(NSUInteger)indexPath.row];

    UITableViewCell *cell;

    if(isStarRank)

    {

        cell = [self setupStarCell];

    }

    else

    {

        cell = [self setupDefaultCell];

    }

}


-(StarCell *)setupStarCell

{

    //do something...

}


-(UITableViewCell *)setupDefaultCell

{

    //do something...

}


編輯TableView


TableView提供了方便的編輯功能,,能夠刪除和移動cell。這些事件中,,tableView的dataSource通過委托方法獲取通知,,因此經(jīng)常在這些委托方法中出現(xiàn)對數(shù)據(jù)的修改,而修改數(shù)據(jù)很明顯是model層的任務(wù),。model應(yīng)該提供刪除,、排序等的接口,這樣就能夠通過dataSource的方法來調(diào)用,。從而controller扮演了view和model之間的協(xié)調(diào)者,,而不需要知道m(xù)odel層的實(shí)現(xiàn)細(xì)節(jié)。同時(shí)這樣model的邏輯會變得更容易測試,,因?yàn)闆]有混雜viewController的任務(wù),。


總結(jié)


tableViewController以及其他controller應(yīng)該扮演model和view的協(xié)調(diào)者和中介者,而不應(yīng)該關(guān)心屬于view或者model層的任務(wù),。謹(jǐn)記這點(diǎn),,讓委托和dataSource變得更小和只包含公式化的代碼,。


這不只是減少tableViewController的體積和復(fù)雜度,同時(shí)也把域邏輯和界面邏輯放到相關(guān)的類中,,把實(shí)現(xiàn)細(xì)節(jié)包裹在簡單的API接口中,,最終提高了代碼的可讀性和代碼的協(xié)調(diào)能力。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多