[iOS] View Controller的edit模式切換

關鍵字:
在View controller中,我們會需要去切換正常和編輯(edit)模式,而且當你有Table view時,你也會希望去編輯Table View cell,像是移動或是刪除,本篇文章主要是簡單介紹怎樣去進行這切換。

所謂切換,我這邊操作上的定義是:按下右上角的Edit按鈕,然後Table view cell的左端會跳出紅色的刪除鈕,然後你可以按下這個紅色刪除鈕去刪除該Cell,在此同時,右上角的Edit字樣會改變成Done字樣,按下Done字樣所有的紅色刪除紐都會再次被隱藏。

首先請各位想像一下,你有一個 View Controller,裡面可能有一個以上的Table View,你希望的是當你按下View controller右上方的Edit按鈕時,全部的Table View都變成編輯模式,記住這個需求,這樣下面的程式碼你才會比較好懂。

當你要切換時,你會需要按下View Controller右上角的Edit,請在viewDidLoad內實作:

self.navigationItem.rightBarButtonItem = self.editButtonItem;

這會自動回傳一個edit按鈕,預設會呼叫的方法是setEditing:animated:,而這是View的方法,接下來你要覆寫它:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    [self.tableView setEditing:editing animated:animated];
}

請注意,你在這裡面啟動View controller封裝的tableView的編輯模式,這一行會讓該tableView的每個cell動態的跳出紅色刪除鈕,如果你只是用:

 self.tableView.editing = YES;

那你是看不到紅色按鈕動態的跳出來的喔。所以這是在你的 View Controller進入編輯模式時,你將其中每個sub Table view全都切換成編輯模式,如果你有多個Table view,你可以遍歷每一個Table view去切換。以上到這邊可以參考官方文件。而你可以在進入編輯模式時,調整你的View,可以參考官方文件裡面的程式碼。

再來,你可能會想到對於Cell用手指橫向劃過,可以拉出右方紅色Delete按鈕,這個作法需實作回呼:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self setEditing:YES animated:YES];
}

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self setEditing:NO animated:YES];
}

第一個回呼是開始編輯,這時我讓View controller進入編輯模式,表示右上方edit按鈕會隨著你一個手指將字樣改變成Done。這很合理,因為當你按下Done,你可以關閉這只有單一Cell的編輯狀態,一如直覺,而這關閉的指令是在第二個回呼裡面完成,裡面的animated:都是YES表示你拉出右方紅色按鈕的動作是動態的。

最後不能忘掉的是這個方法:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];
    [self.dataArray removeObjectAtIndex:row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [
}

實作這個方法才能夠確實的刪除特定的Cell。

注意的是,官方文件有提到,即使你有實作tableView: willBeginEditingRowAtIndexPath:和tableView: didEndEditingRowAtIndexPath:這兩個方法,但如果你沒有實作tableView: commitEditingStyle:的話,你手指在Cell上滑動是不會右方的拉出紅色刪除按鈕的。

最後補充一點,如果你刪除Cell的資料不是透過UI(點選Delete按鈕之類的)而是透過程式碼處理的,比如說在你刪除self.dataArray某一個object後,你要讓你的tableView重新讀取資料,這時你要使用reloadData方法。

留言