我已经挖掘过并发现了几个动态添加行到UITableView的例子,而不是分组表,我只是想不出来。我知道自己想做什么 - 我有一个包含3个部分的分组表。我想动态添加“添加新项目”行/单元格到第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]; }
}
这个糟糕的代码会返回此错误:
无效更新:行数无效 在第1节中。行数 包含在现有部分之后 更新(5)必须等于 包含在其中的行数 更新前的部分(5),加或 减去插入的行数或 从该部分删除(1插入, 0已删除)。
所以我有点迷失了。 IndexPaths和Arrays对我来说是新的。实际上这对我来说都是全新的,我在这里倾注了文档和帖子,但我不能说我总是理解它。任何帮助,将不胜感激。我也意识到我仍然需要配置我的单元格和commitEditingStyle方法,但我想我可以弄明白,如果我能理解索引路径和数组。
感谢
----- ----- EDIT
好的,所以我在很大程度上得到了这个。我在编辑时为我的部分添加了一个新行:
- (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和第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]; }
}
答案 0 :(得分:1)
我在编辑时是否需要添加if语句,以便在编辑时为这些部分的计数添加一行?
是的,在您的tableView:numberOfRowsInSection:
方法中,您应该在编辑模式下返回count + 1
。如果您不想在第0部分添加一行,请调整您的if条件,即
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
];