2009-10-02 67 views
4

我有一個UITableView帶有單節和'n'行(從NSMutableArraymyTableArray填充)。當進入編輯模式,我想實現以下目標:在UITableView頂部插入新行作爲進入編輯模式的一部分時編輯樣式的問題

  • 設置了「N」行有UITableViewCellEditingStyleDelete編輯樣式
  • 插入新行,原來的「N」以上,並設置它有UITableViewCellEditingStyleInsert編輯樣式

UITableViewController子類實現如下:

- (void)setEditing:(BOOL)flag animated:(BOOL)animated 
{ 
    [super setEditing:flag animated:animated]; 

    UITableView *tableView = (UITableView *)self.view; 
    NSArray *topIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 

    if (self.editing == YES) 
     [tableView insertRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom]; 
    else 
     [tableView deleteRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom]; 
} 

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 0) 
     return UITableViewCellEditingStyleInsert; 
    else 
     return UITableViewCellEditingStyleDelete; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (self.editing == YES) 
     return [myTableArray count] + 1; 
    else 
     return [myTableArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // ... boiler-plate dequeueReusableCellWithIdentifier code, etc ... 

    if (self.editing == YES) 
    { 
     if (indexPath.row == 0) 
      cell.textLabel.text = @"My new row"; 
     else 
      cell.textLabel.text = [myTableArray objectAtIndex:(indexPath.row - 1)]; 
    } 
    else 
    { 
     cell.textLabel.text = [myTableArray objectAtIndex:indexPath.row]; 
    } 

    return cell; 
} 

當這個代碼運行,而t他按下編輯按鈕,在原來的'n'行之上插入一個新行,但除第一行之外,第二行具有UITableViewCellEditingStyleInsert編輯樣式。例如,如果「n」爲3,後編輯按鈕被按下表顯示:

  • 行0:插入編輯風格
  • 行1:插入編輯樣式(應刪除)
  • 行2:刪除的剪輯風格
  • 第3行:刪除剪輯風格

經過進一步調查,我發現,如果「n」爲3,編輯按鈕被按下時,方法tableView:editingStyleForRowAtIndexPath:被稱爲共8次:

  • [super setEditing:flag animated:animated]導致用於每個原始行0,1和2
  • 隨後[tableView insertRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom]結果在5個呼喚行0,1,2,3,然後0再次
的3個電話

我可以理解編輯樣式需要重新更正爲插入一個新行的結果,但我不明白爲什麼在最後5次調用中,第0行設置了兩次,爲什麼第1行仍然設法擁有風格不正確。

有沒有人有任何見解?

回答

0

嘗試關閉插入的動畫並查看被調用的次數。

您在這裏得到的問題是,當行0是現有的預插入行時,將調用super,然後您將使用動畫執行插入操作,這會導致調用editingStyle ..方法。

以下建議很可怕,但您也可以嘗試在之前編輯,然後進行行插入/刪除操作,然後再調用super。這樣正確的行數就位。

更大的問題是......你是肯定你想插入行是最好的嗎?這是一個非標準的地方,除非你有一個很好的理由違背了UI準則,否則你可能想要考慮改造你的UI來將插入式風格的行放在底部....

+0

當你說它是非標準的,在頂部插入一行時,你指的是哪個UI指南? iPhone人機界面指南? – 2009-10-08 12:05:32

+0

是的。我將補充說,這是一個事實上的標準,將插入式編輯行(帶有綠色加號)作爲您允許添加的每個部分中的最後一行。 也就是說,除非你有很好的理由在別處插入。 – 2009-10-25 07:51:20

+0

這是一種煩人的,必須隱藏最常用的功能,在可能長列表的底部。我想總能在編輯啓用時滾動到底部,但這可能會打開另一罐動畫蠕蟲。 – spstanley 2012-12-25 18:07:43

6

我知道這已經過去了一年,但我Google搜索並偶然發現了這個,所以我們來回答這個問題。

以下似乎工作。 TableViewController在它有機會知道行被插入頂部之前請求編輯樣式。所以我們應該跟蹤我們是否在改變編輯模式和插入之間。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 
    automaticEditControlsDidShow = NO; 
    [super setEditing:editing animated:animated]; 
    NSArray *addRow = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:0 inSection:0],nil]; 
    if (editing) { 
     automaticEditControlsDidShow = YES; 
     [self.tableView insertRowsAtIndexPaths:addRow withRowAnimation:UITableViewRowAnimationLeft]; 
    } else { 
     [self.tableView deleteRowsAtIndexPaths:addRow withRowAnimation:UITableViewRowAnimationLeft]; 
    } 
} 

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    int row = indexPath.row; 

    if (self.editing && row == 0) { 
     if (automaticEditControlsDidShow) 
      return UITableViewCellEditingStyleInsert; 
     return UITableViewCellEditingStyleDelete; 
    } 
    return UITableViewCellEditingStyleDelete; 
} 
+0

編輯意味着插入和不編輯意味着刪除? – andrewz 2016-03-10 19:20:08

+0

@andrewz,這是正確的。 – Philosophistry 2016-03-12 00:30:46

相關問題