2011-05-20 62 views
0

我已經挖掘並找到了幾個動態添加行到UITableView的例子,而不是分組表,我只是無法弄清楚這一點。我知道我想要做什麼 - 我有一個分爲三部分的表格。我想在選擇編輯按鈕時動態添加'添加新項目'行/單元格到第1和第2部分,但不是0。動態添加行到分組表中的多個部分

首先,我對numberOfRowsInSection感到困惑。我最初用這個加載我的表。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

return [[[tableData objectAtIndex:section] objectForKey:@"Rows"] count]; 

}

我需要一個if語句添加時,我編輯的行添加到計數那些部分,當我編輯的?如:

if (editing) { 

    return [[[tableData objectAtIndex:section] objectForKey:@"Rows"] count] + 1; 
} 

我意識到上述情況,如果正確的話,會增加一個行到每一節不只是1和2。我將如何限制?

接下來是我的setEditing函數。這是我真正的問題所在。我相信我需要創建第1和第2部分最後一行的索引路徑數組,以便我可以在它們下面插入新行。下面是錯誤的,只是我的試驗試圖讓某些東西插入某處。

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

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:1]; 
NSMutableArray* paths = [[NSMutableArray alloc] initWithObjects:indexPath, nil]; 

NSArray *paths = [NSArray arrayWithObject: 
        [NSIndexPath indexPathForRow:6 inSection:1]]; 
if (editing) { 
    [[self tableView] insertRowsAtIndexPaths:paths 
          withRowAnimation:UITableViewRowAnimationTop]; } 
else { 
    [[self tableView] deleteRowsAtIndexPaths:paths 
          withRowAnimation:UITableViewRowAnimationTop]; } 

}

那蹩腳的代碼返回此錯誤:

Invalid update: invalid number of rows in section 1. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted).

所以我有點失落。 IndexPaths和Arrays對我來說是新的。其實這對我來說都是新鮮事物,而且我在這裏傾注了文檔和帖子,但我不能說我總是理解它。任何幫助,將不勝感激。我也意識到,我仍然需要配置我的單元格和commitEditingStyle方法,但我想我可以弄清楚,如果我能理解索引路徑和數組。

感謝

----- -----編輯

好了,我得到這個大部分。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  { 

if(self.editing && section != 0) { 
    int rows = 0; 
    rows = [[[tableData objectAtIndex:section] objectForKey:@"Rows"] count] + 1; 
    return rows; 
} 
else { 
    int rows = 0; 
    rows = [[[tableData objectAtIndex:section] objectForKey:@"Rows"] count]; 
    return rows; 
    } 
} 

我已經想通了如何將一個標籤在編輯模式下,應用到這些新行:我當編輯時增加了一個新行到我的部分

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier= @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
//configure the cell... 
if(self.editing && indexPath.section != 0 && (indexPath.row == [[[tableData objectAtIndex:indexPath.section] objectForKey:@"Rows"] count])) { 
    cell.textLabel.text = @"Add new Item"; 
    return cell; 
} 
else  
    cell.textLabel.text = [[[tableData objectAtIndex:indexPath.section] objectForKey:@"Rows"] objectAtIndex:indexPath.row]; 
return cell; 

而且我正確設置我的兩個部分的最後一排,其中該行被添加到樣式插入:

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 

if (indexPath.section == 0) 
    //Can't edit the items in the first section 
    return UITableViewCellEditingStyleNone; 
else 
    //if it's the last row in sections 1 or 2 make it an Insert item 
    if(self.editing && indexPath.section != 0 && (indexPath.row == [[[tableData objectAtIndex:indexPath.section] objectForKey:@"Rows"] count])) { 
     return UITableViewCellEditingStyleInsert; 
    } 
    //Everything else in sections 1 or 2 should be Delete style 
    else 
     return UITableViewCellEditingStyleDelete; 

}

這一切都有效。當然它不生動,我仍然需要幫助。我想,但我不確定是否需要從setEditing方法中插入/刪除行。我相信我需要做的是爲我正在編輯的部分創建一個數組,然後在那裏插入行。下面的* paths數組是錯誤的,因爲我需要一個指向數組1 & 2中的最後一行的數組,我不知道如何創建該數組。或者,也許我所想的一切都是錯誤的。有人可以幫助指路嗎?非常感謝。

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

NSArray *paths = [NSArray arrayWithObject: 
        [NSIndexPath indexPathForRow:?? inSection:??]]; 
if (editing) { 
    [[self tableView] insertRowsAtIndexPaths:paths 
          withRowAnimation:UITableViewRowAnimationTop]; } 
else { 
    [[self tableView] deleteRowsAtIndexPaths:paths 
          withRowAnimation:UITableViewRowAnimationTop]; } 

}

回答

1

Do I need to add an if statement for when I'm editing to add a row to the count for those sections when I'm editing?

是的,在你的tableView:numberOfRowsInSection:方法,你應該在編輯模式返回count + 1。如果您不想在第0部分添加一行,請調整您的條件,即 if(self.editing && section != 0)

您的第二個問題與第一個問題有關。您正在向第1部分插入一個新行,但 numberOfRowsInSection仍爲該部分返回5。它應該返回6.

方法insertRowsAtIndexPaths:withRowAnimation:deleteRowsAtIndexPaths:withRowAnimation: 只是有效地重新加載表和動畫。我建議您現在執行setEditing:animated函數。那麼你應該通過考慮編輯狀態來實現你的tableView:numberOfRowsInSection:tableView:cellForRowAtIndexPath:方法。一切工作正常後,您可以使用插入和刪除方法來更好地控制表的哪些部分被重新加載。

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

- 編輯 -

你是在正確的路徑。您可以使用類似於以下代碼的indexPaths刪除/插入:

NSArray *paths = [NSArray arrayWithObjects: 
    [NSIndexPath indexPathForRow:[[[tableData objectAtIndex:1] objectForKey:@"Rows"] count] inSection:1], 
    [NSIndexPath indexPathForRow:[[[tableData objectAtIndex:2] objectForKey:@"Rows"] count] inSection:2], 
    nil 
]; 
+0

感謝您的幫助。這讓我朝着正確的方向前進。現在我只需要動畫...請參閱上面的編輯。 – Selch 2011-05-22 18:39:49

+0

我編輯了我的答案,並添加了如何檢索索引路徑。 – murat 2011-05-25 11:11:34