1

我在故事板中连接了一个 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、allowsSelection 和 allowSelectionDuringEdit。
我今天花了几个小时在网上搜索其他解决方案,但找不到任何可行的方法。

为了完整起见,这里是委托方法:

- (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];
    }];
}

所以他们基本上只是对服务器进行远程调用,接收更新的对象并将其插入/删除表视图和数据源。

4

2 回答 2

1

问题是在后台运行的缓存更新。它包含一个通知来通知控制器更新的数据,然后重新加载 tableView。

此重新加载是在后台线程中触发的,因此 UI 仍然没有响应。我已经用performSelectorOnMainThread.

我通过设置调试器来观察控制器的数据模型属性发现了这一点。

很抱歉浪费您的时间,@MySpecialPurpose,并感谢您的建议。

于 2013-02-08T09:57:22.223 回答
0

您是否尝试过将 insertrows:/deleterows: 方法调用从调度队列中拉出?

于 2013-02-05T16:32:43.273 回答