我在故事板中连接了一个UITableViewController子类。选择后,将推送数据元素的编辑器。此编辑器具有新条目的“完成”按钮和现有条目的“删除”按钮。它们按如下方式连接:
- (void)doneButtonClicked:(id)sender {
[self setEditing:NO animated:NO];
[self.navigationController popViewControllerAnimated:YES];
[self.delegate taskDefinitionEditor:self didCreate:self.taskDefinition];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch (buttonIndex) {
case 1:
[self.delegate taskDefinitionEditor:self didDelete:self.taskDefinition];
[self.navigationController popViewControllerAnimated:YES];
break;
default:
break;
}
}
UIAlertView是一个确认对话框 如您所见,编辑器调用委托来通知它有关新项目或已删除项目的信息。这将是UITableViewController子类。我使用了委托和导航控制器调用的不同命令,以确定这是否是我的问题的原因。不是。
最后,这是我的问题:
当这样的插入/删除后屏幕返回到表格时,UITableView将暂时不会选择任何单元格或直到滚动。
我尝试在viewDidAppear中手动滚动表格视图,但它没有帮助。我也尝试过reloadData,调试refreshControl,禁用和启用userInteraction,allowSelection和allowsSelectionDuringEdit。
我今天花了几个小时在网上搜索其他解决方案,但无法提出任何有用的解决方案。
为了完整起见,这里是委托方法:
- (void)taskDefinitionEditor:(id)sender didCreate:(TaskDefinitionEntity *)taskDefinition {
//remote call
[self.dataProvider createTaskDefinition:taskDefinition success:^(TaskDefinitionEntity *taskDefinition){
NSMutableArray *mutableDefinitions = self.taskDefinitions.mutableCopy;
[mutableDefinitions addObject:taskDefinition];
self.taskDefinitions = mutableDefinitions;
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:mutableDefinitions.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
});
} failure:^(NSError *error){
NSLog(@"error creating task-definition:\n%@", error);
[self requestFailed:error showAlert:YES];
}];
}
- (void)taskDefinitionEditor:(id)sender didDelete:(TaskDefinitionEntity *)taskDefinition {
//remote call
[self.dataProvider deleteTaskDefinition:taskDefinition success:^(void){
NSMutableArray *mutableDefinitions = self.taskDefinitions.mutableCopy;
NSInteger index = [self.taskDefinitions indexOfObject:taskDefinition];
[mutableDefinitions removeObjectAtIndex:index];
self.taskDefinitions = mutableDefinitions;
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
});
} failure:^(NSError *error){
NSLog(@"error deleting task-definition:\n%@", error);
[self requestFailed:error showAlert:YES];
}];
}
所以他们基本上只是对服务器进行远程调用,接收更新的对象并将其插入/删除到表视图和数据源中。
答案 0 :(得分:1)
问题是在后台运行的缓存更新。它包含一个通知,通知控制器更新的数据,然后重新加载tableView。
此重新加载是在后台线程中触发的,因此UI仍然没有响应。我用performSelectorOnMainThread
修复了它。
我通过将调试器设置为监视控制器的data-model-property来找到它。
抱歉浪费你的时间,@ MySpecialPurpose,并感谢您的建议。
答案 1 :(得分:0)
您是否尝试过插入插件:/ deleterows:方法调用调度队列?