亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2020-07-26 03:26:16
字體:
來源:轉載
供稿:網友

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。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品视频免费播放| 亚洲a在线播放| 92国产精品视频| 久久久国产精品x99av| 久色乳综合思思在线视频| 国产suv精品一区二区| 美女福利视频一区| 久久精品国产电影| 久久久久久久国产| 国产丝袜一区二区| 久久999免费视频| 国产91在线视频| 精品偷拍一区二区三区在线看| 久久久亚洲天堂| 国产精品99免视看9| 国产精品久久久久久久午夜| 欧美激情一区二区三区高清视频| 欧美裸体男粗大视频在线观看| 亚洲男人天堂2023| 国产精品va在线| 成人精品久久一区二区三区| 96sao精品视频在线观看| 久久国产精彩视频| 日韩电影免费观看中文字幕| 96pao国产成视频永久免费| 欧美多人乱p欧美4p久久| 亚洲r级在线观看| 奇门遁甲1982国语版免费观看高清| 欧美成人精品一区二区三区| 欧美最近摘花xxxx摘花| 亚洲男人的天堂在线| 亚洲精品v天堂中文字幕| 亚洲成人性视频| 免费av在线一区| 国产激情久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 欧美成人精品xxx| 亚洲欧美在线一区二区| 亚洲精品福利资源站| 欧美性极品xxxx娇小| 欧美视频免费在线观看| 欧美精品一区二区三区国产精品| 欧美日韩美女视频| 精品视频—区二区三区免费| 亚洲国产精彩中文乱码av在线播放| 欧美一区二区.| 26uuu另类亚洲欧美日本老年| 国产精品久久综合av爱欲tv| 国产精品久久久久久久久久久久久久| 欧美贵妇videos办公室| 精品福利樱桃av导航| 国内精品美女av在线播放| 国产精品jvid在线观看蜜臀| 自拍偷拍亚洲区| 亚洲免费伊人电影在线观看av| 日韩有码视频在线| 精品久久久久久久中文字幕| 一本色道久久88综合亚洲精品ⅰ| 97精品视频在线播放| 欧美电影免费观看大全| 在线精品播放av| 日韩电影在线观看中文字幕| 成人美女免费网站视频| 成人欧美在线观看| 亚洲欧美第一页| 亚洲国产精品成人va在线观看| 奇米一区二区三区四区久久| 欧美成人一区二区三区电影| 国产在线播放91| 亚洲色图av在线| 国产成人aa精品一区在线播放| 成人国产在线激情| 国产精品午夜国产小视频| 日韩在线观看网址| 91av网站在线播放| 亚洲综合中文字幕在线观看| 亚洲福利小视频| 国产精品视频免费在线观看| 欧美成人中文字幕在线| 日韩av高清不卡| 欧美电影在线观看高清| 日韩亚洲欧美中文高清在线| 欧美国产日韩免费| 国产精品久久色| 国产成人涩涩涩视频在线观看| 欧美精品第一页在线播放| 一区二区三区无码高清视频| 亚洲另类欧美自拍| 国产精品成av人在线视午夜片| 国产在线高清精品| 久久这里只有精品99| 欧美限制级电影在线观看| 欧美日韩一区二区三区在线免费观看| 成人网在线观看| 亚洲自拍小视频免费观看| 亚洲精品一区二区三区不| 人妖精品videosex性欧美| 欧美日韩国产在线| 亚洲精品免费av| 欧美视频免费在线| 国产在线观看不卡| www.xxxx欧美| 92福利视频午夜1000合集在线观看| 尤物yw午夜国产精品视频明星| 中文字幕日韩精品在线观看| 97视频在线播放| 久久国产精品久久精品| 久久久影视精品| 欧美性xxxx18| 国产精品久久久久久久久久三级| 91精品国产自产在线老师啪| 在线观看日韩av| 久青草国产97香蕉在线视频| 国产精品久久久久久搜索| 久久99青青精品免费观看| 国产精品一区二区久久久| 精品久久中文字幕| 久久91亚洲人成电影网站| 国产一区二区三区在线播放免费观看| 久久国产精品偷| 欧美日韩国产中文字幕| 国产精品亚发布| 欧美激情久久久久| 亚洲成色999久久网站| 国产成人精品在线| 欧美xxxx18国产| 97在线视频免费看| 另类少妇人与禽zozz0性伦| 国产精品丝袜一区二区三区| 欧美视频一区二区三区…| 激情懂色av一区av二区av| 亚洲成人国产精品| 日韩电影免费观看中文字幕| 国内精品久久久久影院 日本资源| 欧美乱人伦中文字幕在线| 精品久久久国产精品999| 日本久久久a级免费| 国产精品视频永久免费播放| 精品亚洲一区二区三区| 欧美激情视频一区二区三区不卡| 国产精选久久久久久| 中文字幕亚洲欧美| 日本最新高清不卡中文字幕| 成人中文字幕+乱码+中文字幕| 国产视频在线观看一区二区| 国产精品免费视频xxxx| 欧美巨乳美女视频| 欧美成人国产va精品日本一级| 中文字幕精品在线视频| 精品亚洲男同gayvideo网站| 91精品国产免费久久久久久| 久久久亚洲精品视频| 九九热r在线视频精品| 国产免费成人av| 日韩av在线网站| 欧美疯狂xxxx大交乱88av| 久久精品国产清自在天天线| 自拍偷拍免费精品| zzijzzij亚洲日本成熟少妇| 久久综合网hezyo| 国产成人精品日本亚洲| 777777777亚洲妇女| 国产日韩亚洲欧美| 日本久久精品视频|