我在tableView中实现了这段代码:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
return NO;
}
return YES;
}
它做了我想要的,但我想更好一步,当按下编辑按钮时,“第0部分”完全消失(如果你进入iOS上的“键盘”菜单,可以看到这种效果并选择在右上角编辑,前两个部分在动画中消失)。我试图暂时删除第一部分,但是在调用[tableView reloadData];
时我的应用程序崩溃了:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (tvController.editing == YES) {
return 1;
}else if (tvController.editing == NO) {
return 2;
}
return 0;
}
另外,如果我的代码工作正常,我认为我不会得到动画,我认为我的方法是错误的。谢谢你的帮助!
答案 0 :(得分:1)
您的问题
您的某个部分比前一部分长。
由于您通过在numberOfSectionsInTableView:
中报告减少1个部分来隐藏第0部分,因此在编辑模式下,每个委托方法都必须调整部分编号。其中一个没有这样做。
// every delegate method with a section or indexPath must adjust it when editing
- (NSInteger) tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
if (tvController.editing) section++;
return [[customers objectAtIndex:section] count];
}
- (UITableViewCell*) tableView:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath
{
int section = indexPath.section;
if (tvController.editing) section++;
id customer = [[customers objectAtIndex:section] indexPath.row];
// etc
}
我的方法
UITableView reloadSections:withRowAnimation:使用动画重新加载指定的部分。从您的setEding:animated:
委托方法中调用它。
- (void) setEditing:(BOOL)editing animated:(BOOL)animated
{
[super setEditing:editing animated:animated];
UITableViewRowAnimation animation = animated ? UITableViewRowAnimationFade : UITableViewRowAnimationNone;
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:animation];
[self.tableView reloadSectionIndexTitles];
self.navigationItem.hidesBackButton = editing;
}
您的代理人还需要指出隐藏的部分没有行或标题。
- (NSInteger) tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
if (self.editing && section == 0) {
return 0;
}
return [[customers objectAtIndex:section] count];
}
- (NSString*) tableView:(UITableView*) tableView titleForHeaderInSection:(NSInteger) section
{
if (self.editing && section == 0) {
return nil;
}
[[customers objectAtIndex:section] title];
}