国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

iOS App中UITableView左滑出現(xiàn)刪除按鈕的運(yùn)用方法

2020-02-19 15:48:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在開(kāi)發(fā)的時(shí),我們經(jīng)常會(huì)遇到TableView左側(cè)的幻燈片刪除按鈕,UI的設(shè)計(jì)是多種多樣的,系統(tǒng)根本不能滿足需求,也不想導(dǎo)入一些第三方的東西,本文是武林技術(shù)頻道小編帶大家了解iOS App中UITableView左滑出現(xiàn)刪除按鈕的運(yùn)用方法。

UITableView的編輯模式
實(shí)現(xiàn)UITableView簡(jiǎn)單的刪除功能(左滑出現(xiàn)刪除按鈕)
首先UITableView需要進(jìn)入編輯模式。實(shí)現(xiàn)下面的方法,即使什么代碼也不寫(xiě)也會(huì)進(jìn)入編輯模式:

?

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

?

}


當(dāng)點(diǎn)擊出現(xiàn)的Delete按鈕時(shí),會(huì)調(diào)用上面這個(gè)方法,所以在這個(gè)方法里面可以實(shí)現(xiàn)進(jìn)行刪除操作的一些邏輯,比如:

?

?

?


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
????? // 首先修改model
??? [self.books removeObjectAtIndex:indexPath.row];
????? // 之后更新view
??? [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}


如果想要修改Delete這個(gè)按鈕的文本,可以實(shí)現(xiàn)下面的代理方法:

?

?

?


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


這種方式可以很快捷的實(shí)現(xiàn)系統(tǒng)自帶的簡(jiǎn)單刪除方法,并且當(dāng)UITableView進(jìn)入編輯模式的時(shí)候(出現(xiàn)Delete按鈕),繼續(xù)點(diǎn)擊cell則會(huì)自動(dòng)取消編輯模式,非常方便。

?

在一些應(yīng)用中可能會(huì)看到,當(dāng)用戶點(diǎn)擊一個(gè)按鈕的時(shí)候,UITableView里面的cell的左邊會(huì)出現(xiàn)一個(gè)紅色圓,里面是一個(gè)-,當(dāng)點(diǎn)擊這個(gè)-的時(shí)候會(huì)出現(xiàn)左滑效果,出現(xiàn)Delete按鈕。如何實(shí)現(xiàn)的呢?

UITableView有一個(gè)editing屬性,如果將這個(gè)屬性設(shè)置為YES,那么就會(huì)進(jìn)入編輯模式;同樣,設(shè)置為NO,就會(huì)退出。

上面的提到的例子,當(dāng)用戶點(diǎn)擊按鈕的時(shí)候,就進(jìn)入編輯模式,編輯模式默認(rèn)的形式就是在左邊有一個(gè)紅色-,當(dāng)用戶點(diǎn)擊的時(shí)候自帶左滑效果出現(xiàn)Delete按鈕。當(dāng)用戶點(diǎn)擊Delete按鈕的時(shí)候又會(huì)調(diào)用上面提到的方法。

所以說(shuō)了這么多,只需要將editing設(shè)置為YES并實(shí)現(xiàn)上面的方法就可以達(dá)到上述效果。

?

UITableViewCell的重用
UITableViewCell如果在tableView:cellForRowAtIndexPath:方法中,像其他類(lèi)一樣,使用下面的方式創(chuàng)建:

?

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


這樣雖然能正確顯示,但是性能是有問(wèn)題的。

?

蘋(píng)果實(shí)際上是幫我們提高了性能了的。假設(shè)要顯示200行數(shù)據(jù),如果同時(shí)創(chuàng)建200個(gè)cell,那么無(wú)疑會(huì)非常消耗性能,并且并沒(méi)有太大的意義——因?yàn)橛行ヽell根本還沒(méi)有顯示出來(lái)。

所以在使用UITableView的時(shí)候,只有在cell即將顯示的時(shí)候才會(huì)調(diào)用tableView:cellForRowAtIndexPath:方法,也就是說(shuō),如果有200行數(shù)據(jù),那么只會(huì)創(chuàng)建我們可以看到的cell,而那些看不到的數(shù)據(jù),則不會(huì)創(chuàng)建對(duì)應(yīng)的cell。

比如在手機(jī)屏幕上可以同時(shí)顯示5個(gè)cell(編號(hào)為0 - 4),那么當(dāng)用戶向上滑tableView的時(shí)候,第6個(gè)cell即將出現(xiàn),而第1個(gè)cell還未消失,所以此時(shí)會(huì)創(chuàng)建6個(gè)UITableViewCell。當(dāng)?shù)?個(gè)cell出現(xiàn),那么第1個(gè)cell就會(huì)完全從屏幕上消失,此時(shí)這個(gè)UITableViewCell的對(duì)象將被銷(xiāo)毀,并且第7個(gè)cell被創(chuàng)建。以此類(lèi)推,當(dāng)有新的cell出現(xiàn),那么就會(huì)創(chuàng)建一個(gè)新的cell,銷(xiāo)毀消失的那個(gè)cell。

這樣雖然不必同時(shí)創(chuàng)建200個(gè)cell,但是在不斷地創(chuàng)建-銷(xiāo)毀cell,性能上依然會(huì)有問(wèn)題。

蘋(píng)果提供的更好的方法是將cell復(fù)用,而不是銷(xiāo)毀。

每次有新的cell出現(xiàn)的時(shí)候(也就是tableView:cellForRowAtIndexPath:方法執(zhí)行的時(shí)候),不應(yīng)該直接創(chuàng)建一個(gè)cell,而是應(yīng)該去緩沖池中查找有沒(méi)有可復(fù)用的cell,如果有,那么就重用這個(gè)cell;如果沒(méi)有,則創(chuàng)建一個(gè)cell。這樣無(wú)論數(shù)據(jù)是200行,2000行還是20000行,實(shí)際上創(chuàng)建的只是屏幕可見(jiàn)的cell的個(gè)數(shù)。

還是上面的例子,當(dāng)?shù)?個(gè)cell即將出現(xiàn),第1個(gè)cell消失,此時(shí)并不會(huì)銷(xiāo)毀第一個(gè)cell,而是將它放入緩沖池中等待復(fù)用。此時(shí)第7個(gè)cell會(huì)首先去緩沖池中尋找是否有可復(fù)用的cell,發(fā)現(xiàn)有(就是消失的第1個(gè)cell),那么就會(huì)拿來(lái)復(fù)用,而不是重新創(chuàng)建。這樣一來(lái),消失一個(gè),下次就會(huì)重用這個(gè),這樣就可以保證創(chuàng)建最少數(shù)量的cell,仍然可以滿足需求。

實(shí)現(xiàn)cell的重用可以采用下面的方法:

使用代碼自己來(lái)創(chuàng)建新的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;
}


這里有幾點(diǎn)需要注意:

?

當(dāng)cell為nil,需要?jiǎng)?chuàng)建新的cell的時(shí)候,使用的是initWithStyle:reuseIdentifier:方法,而不是init方法,這樣做是因?yàn)閯?chuàng)建新的cell的時(shí)候需要綁定一個(gè)identifier,這樣在重用的時(shí)候才能找到可重用的相同類(lèi)型。如果使用init方法則沒(méi)有綁定identifier,這樣在重用的時(shí)候無(wú)法成功找到對(duì)應(yīng)的可重用的cell。

一般在if(!cell)中,也就是在新創(chuàng)建cell的時(shí)候,將一些只需要初始化一次的屬性進(jìn)行初始化,而不是在這個(gè)括號(hào)的外面。因?yàn)樵诶ㄌ?hào)外面會(huì)執(zhí)行多次,而這些屬性并不需要多次設(shè)置。同樣,如果不同的cell需要設(shè)置不同屬性或數(shù)據(jù),那么需要在括號(hào)外執(zhí)行,因?yàn)槔ㄌ?hào)外面每次cell出現(xiàn)都會(huì)執(zhí)行到,這樣可以保證不用的cell對(duì)應(yīng)不同的屬性或數(shù)據(jù)。如果將本該設(shè)置不同cell對(duì)應(yīng)不同屬性的代碼放在括號(hào)里面,在復(fù)用cell的時(shí)候不會(huì)重新覆蓋這些數(shù)據(jù),會(huì)出現(xiàn)不正確的結(jié)果,早晨數(shù)據(jù)冗余的問(wèn)題。

另一種方法是自動(dòng)創(chuàng)建新的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;
}


首先需要注冊(cè)class,意思就是告訴tableView,首先去緩沖池中找有沒(méi)有可重用的cell,如果有,則拿過(guò)來(lái)重用;如果沒(méi)有,那么根據(jù)之前注冊(cè)的UITableViewCell這個(gè)類(lèi),來(lái)自動(dòng)生成一個(gè)cell,并且給它綁定上重用identifier。

?

這個(gè)方法省去了我們自己手動(dòng)創(chuàng)建cell,但是也有不足:蘋(píng)果提供給我們的cell的樣式,除了默認(rèn)的,我們都不能用了。

第一種方法我們通過(guò)手動(dòng)創(chuàng)建cell,使用initWithStyle:reuseIdentifier:可以傳入不同的style來(lái)創(chuàng)建蘋(píng)果為我們提供的cell,但是在第二種方法中無(wú)法實(shí)現(xiàn)了。

第二種方法更多的時(shí)候用在我們自定義Cell。雖然無(wú)法使用更多的系統(tǒng)自帶樣式,但是我們首先可以注冊(cè)自定義的cell的類(lèi)(將UITableViewCell換成自定義的Cell),然后仍然首先去緩沖池中找有沒(méi)有可重用cell,如果沒(méi)有,則根據(jù)注冊(cè)的cell來(lái)創(chuàng)建cell并綁定identifier。當(dāng)然,在使用dequeueReusableCellWithIdentifier:的時(shí)候,返回的應(yīng)該也是自定義的Cell類(lèi)型。

注冊(cè)的不僅可以是Class,還可以是nib,也就是說(shuō)可以注冊(cè)通過(guò)xib創(chuàng)建的cell,和上面的方法同理。

還可以直接通過(guò)Storyboard,設(shè)置好prototype cell的identifier,在dequeueReusableCellWithIdentifier:中就可以直接使用cell,既不用提前注冊(cè),也不用手動(dòng)創(chuàng)建cell。

上文是關(guān)于iOS App中UITableView左滑出現(xiàn)刪除按鈕的運(yùn)用方法,相信大家都了解了,更多的技術(shù)知識(shí),請(qǐng)繼續(xù)關(guān)注武林技術(shù)頻道!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 富蕴县| 玛多县| 尚义县| 诸暨市| 贵德县| 玉溪市| 瓮安县| 潢川县| 中宁县| 湘乡市| 沂源县| 自贡市| 宁陕县| 阿克| 花垣县| 莱西市| 会昌县| 中超| 华亭县| 郴州市| 道真| 太康县| 柯坪县| 太谷县| 平顶山市| 偃师市| 黄陵县| 梨树县| 宁陵县| 中山市| 百色市| 盐亭县| 永康市| 广河县| 中超| 大安市| 铜山县| 阳山县| 马山县| 濮阳市| 铜山县|