moveRowAtIndexPath:如何在最后一行移动到另一个部分后删除部分
Posted
技术标签:
【中文标题】moveRowAtIndexPath:如何在最后一行移动到另一个部分后删除部分【英文标题】:moveRowAtIndexPath: how to delete section once last row is moved to another section 【发布时间】:2009-10-11 01:58:52 【问题描述】:我有一个包含几个部分的表格视图。我希望能够将行从一个部分移动到另一个部分,并在没有行时删除一个部分。我正在尝试通过 moveRowAtIndexPath 执行此操作,但我的代码不起作用并引发 NSRangeException 异常。
这是一个代码示例:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
NSUInteger fromSection = [fromIndexPath section];
NSUInteger fromRow = [fromIndexPath row];
NSString *fromKey = [self.keys objectAtIndex:fromSection];
NSMutableArray *fromEventSection = [self.eventsDict objectForKey:fromKey];
NSUInteger toSection = [toIndexPath section];
NSUInteger toRow = [toIndexPath row];
NSString *toKey = [self.keys objectAtIndex:toSection];
NSMutableArray *toEventSection = [self.eventsDict objectForKey:toKey];
id object = [[fromEventSection objectAtIndex:fromRow] retain];
[fromEventSection removeObjectAtIndex:fromRow];
[toEventSection insertObject:object atIndex:toRow];
[object release];
// The above code works just fine!
// Try to delete an empty section. Here is where trouble begins:
if ((fromSection != toSection) && [fromEventSection count] == 0)
[self.keys removeObjectAtIndex:fromSection];
[self.eventsDict removeObjectForKey:fromKey];
[tableView deleteSections:[NSIndexSet indexSetWithIndex:fromSection] withRowAnimation:UITableViewRowAnimationFade];
【问题讨论】:
你得到这个答案了吗?我也想不通 不完全是。但我确实按照以下方式解决了它:当用户移动行时,我停止尝试删除空白部分,而是选择在用户完成编辑后删除空白部分。但是,即便如此,删除和空白部分也无法正常工作(我怀疑是 Apple 错误)。因此,为了删除空白部分,我最终在每个空白部分中添加了一行零高度,然后删除了这些部分。看看 YouTube 中的这个演示:tinyurl.com/ycg4uhs 看看这种方法是否适合您。 【参考方案1】:我很幸运地在 moveRowAtIndexPath 方法结束后的块中执行 deleteSections 方法,方法是将删除包装在 dispatch_async 中。
dispatch_async(dispatch_get_main_queue(), ^
if ((fromSection != toSection) && [fromEventSection count] == 0)
[self.keys removeObjectAtIndex:fromSection];
[self.eventsDict removeObjectForKey:fromKey];
[tableView deleteSections:[NSIndexSet indexSetWithIndex:fromSection] withRowAnimation:UITableViewRowAnimationFade];
);
【讨论】:
【参考方案2】:这也让我有些难过。我已成功使用延迟执行部分删除。
这是我如何让它工作的 - 假设您使用存储来包含所有对象,并且存储具有移动项目的方法:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
NSInteger beforeSectionCount = [store sectionCount];
[store moveObject:fromIndexPath toIndexPath:toIndexPath];
if (beforeSectionCount > [store sectionCount]
[self performSelector:@selector(deleteSection:) withObject:fromIndexPath: afterDelay:0.2]
- (void)deleteSection:(NSIndexPath *)indexPath
[[self tableView] beginUpdates];
[[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]]
withRowAnimation:UITableViewRowAnimationFade];
[[self tableView] endUpdates];
【讨论】:
以上是关于moveRowAtIndexPath:如何在最后一行移动到另一个部分后删除部分的主要内容,如果未能解决你的问题,请参考以下文章
使用tableView:moveRowAtIndexPath:toIndexPath:方法后,将新订单保存到核心数据
UITableView: 使用 moveRowAtIndexPath:toIndexPath: 和 reloadRowsAtIndexPaths:withRowAnimation: 一起出现损坏