IOS UITableView中行的操作

來源:互聯網
上載者:User
這篇文章主要講的表格的操作包括:標記行、移動行、刪除行、插入行。

這次就不從頭建立工程了,在http://www.oschina.net/code/snippet_164134_9876下載工程。這個工程就是最簡單的產生一個表格並向其中寫入資料。用Xcode 4.2開啟它,在這個工程基礎上實現以上操作。

1、標記行

這裡講的標記行指的是單擊此行,可以實現在此行右邊出現一個勾,如所示:

為了實現標記功能,在ViewController.m中@end之前添加代碼:

#pragma mark -#pragma mark Table Delegate Methods- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {     UITableViewCell *oneCell = [tableView cellForRowAtIndexPath: indexPath];    if (oneCell.accessoryType == UITableViewCellAccessoryNone) {        oneCell.accessoryType = UITableViewCellAccessoryCheckmark;    } else         oneCell.accessoryType = UITableViewCellAccessoryNone;    [tableView deselectRowAtIndexPath:indexPath animated:YES]; }

該代碼實現:單擊某行時,若此行未被標記,則標記此行;若此行已經被標記,則取消標幟。

運行效果如。

上面的代碼實際上就是修改某行的accessoryType屬性,這個屬性可以設為四個常量:

UITableViewCellAccessoryCheckmarkUITableViewCellAccessoryDetailDisclosureButtonUITableViewCellAccessoryDisclosureIndicatorUITableViewCellAccessoryNone

效果依次如所示:

            

   UITableViewCellAccessoryCheckmark            UITableViewCellAccessoryDetailDisclosureButton

                

UITableViewCellAccessoryDisclosureIndicator                   UITableViewCellAccessoryNone

注意,上面第二張圖片中的藍色圓圈不僅僅是一個表徵圖,還是一個控制項,點擊它可以觸發事件,在上一篇部落格《iOS開發16:使用Navigation Controller切換視圖》使用過。

2、移動行

想要實現移動或者刪除行這樣的操作,需要啟動表格的編輯模式。使用的是setEditing:animated:方法。

2.1 開啟ViewController.xib,將其中的表格控制項映射成Outlet到ViewController.h,名稱為myTableView。

2.2 開啟ViewController.m,在viewDidLoad方法最後添加代碼:

//啟動表格的編輯模式[self.myTableView setEditing:YES animated:YES];

2.3 在@end之前添加代碼:

//開啟編輯模式後,預設情況下每行左邊會出現紅的刪除按鈕,這個方法就是關閉這些按鈕的- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView           editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {     return UITableViewCellEditingStyleNone; } //這個方法用來告訴表格 這一行是否可以移動- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {     return YES; }//這個方法就是執行移動操作的- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)        sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {    NSUInteger fromRow = [sourceIndexPath row];     NSUInteger toRow = [destinationIndexPath row];         id object = [list objectAtIndex:fromRow];     [list removeObjectAtIndex:fromRow];     [list insertObject:object atIndex:toRow]; }

editingStyleForRowAtIndexPath這個方法中用到了常量UITableViewCellEditingStyleNone,它表示不可編輯,這裡的編輯指的是刪除和插入。表示表格行的編輯模式的常量有:

UITableViewCellEditingStyleDeleteUITableViewCellEditingStyleInsertUITableViewCellEditingStyleNone

顧名思義,第一個表示刪除,第二個表示插入,第三個表示不可編輯。

若將editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleNone依次換成上面三個值,則它們啟動並執行效果依次如所示:

    

2.4 運行,從可以看到實現了行的移動:

但是也會發現,現在無法對每行進行標記了。這說明,在編輯模式下,無法選擇行,從而didSelectRowAtIndexPath這個方法不會執行。

3、刪除行

從第2步過來,實現刪除某行,其實比較簡單了。

3.1將editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleNone修改成UITableViewCellEditingStyleDelete。

3.2 在@end之前添加代碼:

//這個方法根據參數editingStyle是UITableViewCellEditingStyleDelete//還是UITableViewCellEditingStyleDelete執行刪除或者插入- (void)tableView:(UITableView *)tableView commitEditingStyle:    (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {    NSUInteger row = [indexPath row];    if (editingStyle == UITableViewCellEditingStyleDelete) {        [self.list removeObjectAtIndex:row];         [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]                         withRowAnimation:UITableViewRowAnimationAutomatic];     }}

在這個方法中又出現了一個常量:UITableViewRowAnimationAutomatic,它表示刪除時的效果,類似的常量還有:

UITableViewRowAnimationAutomaticUITableViewRowAnimationTopUITableViewRowAnimationBottomUITableViewRowAnimationLeftUITableViewRowAnimationRightUITableViewRowAnimationMiddleUITableViewRowAnimationFadeUITableViewRowAnimationNone

它們的效果就不一一介紹了,可以在實際使用時試試。

3.3 運行,看看效果:

    

剛運行時顯示如左邊的圖片,點擊某一行左邊的圓圈表徵圖,會顯示如中間圖片所示。然後點擊Delegate按鈕,那一行就會被刪除掉,如右邊的那張圖片所示,它顯示的是刪除時的效果。

4、插入行

這個與刪除行類似。

4.1 首先將editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleDelete修改成UITableViewCellEditingStyleInsert。

4.2在3.2添加的方法中添加代碼:

else {    //我們實現的是在所選行的位置插入一行,因此直接使用了參數indexPath    NSArray *insertIndexPaths = [NSArray arrayWithObjects:indexPath,nil];    //同樣,將資料加到list中,用的row    [self.list insertObject:@"新添加的行" atIndex:row];    [tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];}

上面的代碼中也可以不用insertRowsAtIndexPaths方法,而直接使用[tableView reloadData];語句,但是這樣就沒有添加的效果了。

4.3 好了,運行一下:

    

剛運行時如上面左圖所示,單擊了某個加號後,新的一行就從右邊飛進來了,因為在insertRowsAtIndexPaths中用了參數UITableViewRowAnimationRight。

UITableView每個cell之間的預設分割線如何去掉

很簡單,只需要

tableView.separatorStyle = NO;

這次就不從頭建立工程了,在http://www.oschina.net/code/snippet_164134_9876下載工程。這個工程就是最簡單的產生一個表格並向其中寫入資料。用Xcode 4.2開啟它,在這個工程基礎上實現以上操作。

1、標記行

這裡講的標記行指的是單擊此行,可以實現在此行右邊出現一個勾,如所示:

為了實現標記功能,在ViewController.m中@end之前添加代碼:

#pragma mark -#pragma mark Table Delegate Methods- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {     UITableViewCell *oneCell = [tableView cellForRowAtIndexPath: indexPath];    if (oneCell.accessoryType == UITableViewCellAccessoryNone) {        oneCell.accessoryType = UITableViewCellAccessoryCheckmark;    } else         oneCell.accessoryType = UITableViewCellAccessoryNone;    [tableView deselectRowAtIndexPath:indexPath animated:YES]; }

該代碼實現:單擊某行時,若此行未被標記,則標記此行;若此行已經被標記,則取消標幟。

運行效果如。

上面的代碼實際上就是修改某行的accessoryType屬性,這個屬性可以設為四個常量:

UITableViewCellAccessoryCheckmarkUITableViewCellAccessoryDetailDisclosureButtonUITableViewCellAccessoryDisclosureIndicatorUITableViewCellAccessoryNone

效果依次如所示:

            

   UITableViewCellAccessoryCheckmark            UITableViewCellAccessoryDetailDisclosureButton

                

UITableViewCellAccessoryDisclosureIndicator                   UITableViewCellAccessoryNone

注意,上面第二張圖片中的藍色圓圈不僅僅是一個表徵圖,還是一個控制項,點擊它可以觸發事件,在上一篇部落格《iOS開發16:使用Navigation Controller切換視圖》使用過。

2、移動行

想要實現移動或者刪除行這樣的操作,需要啟動表格的編輯模式。使用的是setEditing:animated:方法。

2.1 開啟ViewController.xib,將其中的表格控制項映射成Outlet到ViewController.h,名稱為myTableView。

2.2 開啟ViewController.m,在viewDidLoad方法最後添加代碼:

//啟動表格的編輯模式[self.myTableView setEditing:YES animated:YES];

2.3 在@end之前添加代碼:

//開啟編輯模式後,預設情況下每行左邊會出現紅的刪除按鈕,這個方法就是關閉這些按鈕的- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView           editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {     return UITableViewCellEditingStyleNone; } //這個方法用來告訴表格 這一行是否可以移動- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {     return YES; }//這個方法就是執行移動操作的- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)        sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {    NSUInteger fromRow = [sourceIndexPath row];     NSUInteger toRow = [destinationIndexPath row];         id object = [list objectAtIndex:fromRow];     [list removeObjectAtIndex:fromRow];     [list insertObject:object atIndex:toRow]; }

editingStyleForRowAtIndexPath這個方法中用到了常量UITableViewCellEditingStyleNone,它表示不可編輯,這裡的編輯指的是刪除和插入。表示表格行的編輯模式的常量有:

UITableViewCellEditingStyleDeleteUITableViewCellEditingStyleInsertUITableViewCellEditingStyleNone

顧名思義,第一個表示刪除,第二個表示插入,第三個表示不可編輯。

若將editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleNone依次換成上面三個值,則它們啟動並執行效果依次如所示:

    

2.4 運行,從可以看到實現了行的移動:

但是也會發現,現在無法對每行進行標記了。這說明,在編輯模式下,無法選擇行,從而didSelectRowAtIndexPath這個方法不會執行。

3、刪除行

從第2步過來,實現刪除某行,其實比較簡單了。

3.1將editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleNone修改成UITableViewCellEditingStyleDelete。

3.2 在@end之前添加代碼:

//這個方法根據參數editingStyle是UITableViewCellEditingStyleDelete//還是UITableViewCellEditingStyleDelete執行刪除或者插入- (void)tableView:(UITableView *)tableView commitEditingStyle:    (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {    NSUInteger row = [indexPath row];    if (editingStyle == UITableViewCellEditingStyleDelete) {        [self.list removeObjectAtIndex:row];         [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]                         withRowAnimation:UITableViewRowAnimationAutomatic];     }}

在這個方法中又出現了一個常量:UITableViewRowAnimationAutomatic,它表示刪除時的效果,類似的常量還有:

UITableViewRowAnimationAutomaticUITableViewRowAnimationTopUITableViewRowAnimationBottomUITableViewRowAnimationLeftUITableViewRowAnimationRightUITableViewRowAnimationMiddleUITableViewRowAnimationFadeUITableViewRowAnimationNone

它們的效果就不一一介紹了,可以在實際使用時試試。

3.3 運行,看看效果:

    

剛運行時顯示如左邊的圖片,點擊某一行左邊的圓圈表徵圖,會顯示如中間圖片所示。然後點擊Delegate按鈕,那一行就會被刪除掉,如右邊的那張圖片所示,它顯示的是刪除時的效果。

4、插入行

這個與刪除行類似。

4.1 首先將editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleDelete修改成UITableViewCellEditingStyleInsert。

4.2在3.2添加的方法中添加代碼:

else {    //我們實現的是在所選行的位置插入一行,因此直接使用了參數indexPath    NSArray *insertIndexPaths = [NSArray arrayWithObjects:indexPath,nil];    //同樣,將資料加到list中,用的row    [self.list insertObject:@"新添加的行" atIndex:row];    [tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];}

上面的代碼中也可以不用insertRowsAtIndexPaths方法,而直接使用[tableView reloadData];語句,但是這樣就沒有添加的效果了。

4.3 好了,運行一下:

    

剛運行時如上面左圖所示,單擊了某個加號後,新的一行就從右邊飛進來了,因為在insertRowsAtIndexPaths中用了參數UITableViewRowAnimationRight。

UITableView每個cell之間的預設分割線如何去掉

很簡單,只需要

tableView.separatorStyle = NO;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.