您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>通訊/手機(jī)編程>

iOS中保持TableView代碼整潔和結(jié)構(gòu)清晰的方法

大小:0.2 MB 人氣: 2017-09-25 需要積分:1

  導(dǎo)語(yǔ)

  TableView 是iOS app 中最常用的控件,許多代碼直接或者間接的關(guān)聯(lián)到table view任務(wù)中,包括提供數(shù)據(jù)、更新tableView、控制tableView行為等等。下面會(huì)提供保持tableView代碼整潔和結(jié)構(gòu)清晰的方法。

  UITableViewController vs. UIViewController

  TableViewController的特性

  table view controllers可以讀取table view的數(shù)據(jù)、設(shè)置tabvleView的編輯模式、反應(yīng)鍵盤(pán)通知等等。同時(shí)Table view controller能夠通過(guò)使用UIRefreshControl來(lái)支持“下拉刷新”。

  Child View Controllers

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

  -(void)addDetailTableView

  {

  DetailViewController *detail = [DetailViewController new];

 ?。踕etail setup];

  detail.delegate = self;

 ?。踫elf addChildViewController:detail];

  [detail setupView];

 ?。踫elf.view addSubview:detail.view];

 ?。踕etail 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

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

  分散代碼

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

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

  消除ModelObeject和Cell之間的隔閡

  在很多情況下,我們需要提交我們想要在view層展示的數(shù)據(jù),同時(shí)我們也行維持view層和model層的分離,所以tableView中的dateSource常常做了超額的工作:

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

  {

  Cell *cell = [tableView dequeueReusableCellWithIdentifier:@“Cell”];

 ?。踓ell setup];

  NSString *text = self.title;

  cell.label.text = text;

  UIImage *photo = [UIImage imageWithName:text];

  cell.photoView.image = photo;

  }

  這樣dataSorce會(huì)變得很雜亂,應(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將會(huì)變得十分簡(jiǎn)單。

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

  {

  Cell *cell = [tableView dequeueReusableCellWithIdentifier:@“Cell”];

 ?。踓ell configCellWithTitle:self.title];

  return cell;

  }

  復(fù)用cell

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

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?