你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS App中UITableView左滑湧現刪除按鈕及其cell的重用

iOS App中UITableView左滑湧現刪除按鈕及其cell的重用

編輯:IOS開發綜合

UITableView的編纂形式
完成UITableView簡略的刪除功效(左滑湧現刪除按鈕)
起首UITableView須要進入編纂形式。完成上面的辦法,即便甚麼代碼也不寫也會進入編纂形式:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

}

當點擊湧現的Delete按鈕時,會挪用下面這個辦法,所以在這個辦法外面可以完成停止刪除操作的一些邏輯,好比:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
      // 起首修正model
    [self.books removeObjectAtIndex:indexPath.row];
      // 以後更新view
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

假如想要修正Delete這個按鈕的文本,可以完成上面的署理辦法:

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @"刪除";
}

這類方法可以很快捷的完成體系自帶的簡略刪除辦法,而且當UITableView進入編纂形式的時刻(湧現Delete按鈕),持續點擊cell則會主動撤消編纂形式,異常便利。

在一些運用中能夠會看到,當用戶點擊一個按鈕的時刻,UITableView外面的cell的右邊會湧現一個白色圓,外面是一個-,當點擊這個-的時刻會湧現左滑後果,湧現Delete按鈕。若何完成的呢?

UITableView有一個editing屬性,假如將這個屬性設置為YES,那末就會進入編纂形式;異樣,設置為NO,就會加入。

下面的提到的例子,當用戶點擊按鈕的時刻,就進入編纂形式,編纂形式默許的情勢就是在右邊有一個白色-,當用戶點擊的時刻自帶左滑後果湧現Delete按鈕。當用戶點擊Delete按鈕的時刻又會挪用下面提到的辦法。

所以說了這麼多,只須要將editing設置為YES並完成下面的辦法便可以到達上述後果。

UITableViewCell的重用
UITableViewCell假如在tableView:cellForRowAtIndexPath:辦法中,像其他類一樣,應用上面的方法創立:

UITableViewCell *cell = [[UITableViewCell alloc] init];
cell.textLabel.text = @"hello";
...

如許固然能准確顯示,然則機能是有成績的。

蘋果現實上是幫我們進步了機能了的。假定要顯示200行數據,假如同時創立200個cell,那末無疑會異常消費機能,而且並沒有太年夜的意義——由於有些cell基本還沒有顯示出來。

所以在應用UITableView的時刻,只要在cell行將顯示的時刻才會挪用tableView:cellForRowAtIndexPath:辦法,也就是說,假如有200行數據,那末只會創立我們可以看到的cell,而那些看不到的數據,則不會創立對應的cell。

好比在手機屏幕上可以同時顯示5個cell(編號為0 - 4),那末當用戶向上滑tableView的時刻,第6個cell行將湧現,而第1個cell還未消逝,所以此時會創立6個UITableViewCell。當第7個cell湧現,那末第1個cell就會完整從屏幕上消逝,此時這個UITableViewCell的對象將被燒毀,而且第7個cell被創立。以此類推,當有新的cell湧現,那末就會創立一個新的cell,燒毀消逝的誰人cell。

如許固然不用同時創立200個cell,然則在赓續地創立-燒毀cell,機能上仍然會有成績。

蘋果供給的更好的辦法是將cell復用,而不是燒毀。

每次有新的cell湧現的時刻(也就是tableView:cellForRowAtIndexPath:辦法履行的時刻),不該該直接創立一個cell,而是應當去緩沖池中查找有無可復用的cell,假如有,那末就重用這個cell;假如沒有,則創立一個cell。如許不管數據是200行,2000行照樣20000行,現實上創立的只是屏幕可見的cell的個數。

照樣下面的例子,當第7個cell行將湧現,第1個cell消逝,此時其實不會燒毀第一個cell,而是將它放入緩沖池中期待復用。此時第7個cell會起首去緩沖池中尋覓能否有可復用的cell,發明有(就是消逝的第1個cell),那末就會拿來復用,而不是從新創立。如許一來,消逝一個,下次就會重用這個,如許便可以包管創立起碼數目的cell,依然可以知足需求。

完成cell的重用可以采取上面的辦法:

應用代碼本身來創立新的cell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString * const cellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
          cell.backgroundColor = [UIColor greenColor];
    }
    cell.textLabel.text = @"hello";

    return cell;
}

這裡有幾點須要留意:

當cell為nil,須要創立新的cell的時刻,應用的是initWithStyle:reuseIdentifier:辦法,而不是init辦法,如許做是由於創立新的cell的時刻須要綁定一個identifier,如許在重用的時刻能力找到可重用的雷同類型。假如應用init辦法則沒有綁定identifier,如許在重用的時刻沒法勝利找到對應的可重用的cell。

普通在if(!cell)中,也就是在新創立cell的時刻,將一些只須要初始化一次的屬性停止初始化,而不是在這個括號的裡面。由於在括號裡面會履行屢次,而這些屬性其實不須要屢次設置。異樣,假如分歧的cell須要設置分歧屬性或數據,那末須要在括號外履行,由於括號裡面每次cell湧現都邑履行到,如許可以包管不消的cell對應分歧的屬性或數據。假如將本該設置分歧cell對應分歧屬性的代碼放在括號外面,在復用cell的時刻不會從新籠罩這些數據,會湧現不准確的成果,凌晨數據冗余的成績。

另外一種辦法是主動創立新的cell:

NSString * const cellIdentifier = @"CellIdentifier";

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    cell.textLabel.text = @"hello";

    return cell;
}

起首須要注冊class,意思就是告知tableView,起首去緩沖池中找有無可重用的cell,假如有,則拿過去重用;假如沒有,那末依據之前注冊的UITableViewCell這個類,來主動生成一個cell,而且給它綁定上重用identifier。

這個辦法省去了我們本身手動創立cell,然則也有缺乏:蘋果供給給我們的cell的款式,除默許的,我們都不克不及用了。

第一種辦法我們經由過程手動創立cell,應用initWithStyle:reuseIdentifier:可以傳入分歧的style來創立蘋果為我們供給的cell,然則在第二種辦法中沒法完成了。

第二種辦法更多的時刻用在我們自界說Cell。固然沒法應用更多的體系自帶款式,然則我們起首可以注冊自界說的cell的類(將UITableViewCell換成自界說的Cell),然後依然起首去緩沖池中找有無可重用cell,假如沒有,則依據注冊的cell來創立cell並綁定identifier。固然,在應用dequeueReusableCellWithIdentifier:的時刻,前往的應當也是自界說的Cell類型。

注冊的不只可所以Class,還可所以nib,也就是說可以注冊經由過程xib創立的cell,和下面的辦法同理。

還可以直接經由過程Storyboard,設置好prototype cell的identifier,在dequeueReusableCellWithIdentifier:中便可以直接應用cell,既不消提早注冊,也不消手動創立cell。

【iOS App中UITableView左滑湧現刪除按鈕及其cell的重用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved