【发布时间】:2014-02-20 00:32:11
【问题描述】:
为了提供一些上下文,我有一个简单的 UITableViewController,它用数据填充 UITableView。选择一行后,我会通过创建自定义 UIViewController 的新实例并将其推送到导航控制器上来进入详细信息屏幕:
-(void)tableView:(UITableView *)itemTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[itemTableView deselectRowAtIndexPath:indexPath animated:NO];
NSDictionary *mydata = [self.dataRows objectAtIndex:indexPath.row];
NameDetailViewController *NDVC = [[NameDetailViewController alloc] initWithName:[mydata objectForKey:@"Name"]
AndEmail:[mydata objectForKey:@"Email"]
AndID:[mydata objectForKey:@"Id"]];
[self.navigationController pushViewController:NDVC animated:YES];
}
细节控制器本身有几个文本字段和一个更新按钮。当按下更新按钮时,我会更新我的模型,然后尝试使用以下命令导航回之前的 UITableViewController:
[self.navigationController popViewControllerAnimated:YES];
当我这样做时,应用程序崩溃了,我收到一个错误,就像尼克在之前的 SO 帖子中遇到的错误一样:Error when dismissing view controller - 关于 -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] 中的断言失败(我可以提供更多详细信息)如果需要)。
在调用 pop 来解决这个问题之前,我尝试做一些事情
[self.view endEditing:YES];
以及在每个 UITextfield 上使用 resignFirstResponder。两者都没有做任何事情。
但是,我发现如果我使用主线程:
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popViewControllerAnimated:YES];
});
它似乎工作得很好。我不知道为什么会这样,并且对它为什么会崩溃没有非常明确的理解。我假设它与我的细节控制器在从堆栈中删除后尝试做某事有关。
无论如何,我希望这里有人可以帮助我理解为什么这似乎有效,以及这是否是我解决此问题的合理方法。
【问题讨论】:
-
代码当时是否在后台线程上运行?在 pop 周围显示更多代码。
-
从代码中不清楚 - 但是看起来代码以某种方式在后台线程上运行。任何 UI 更新都必须始终在主线程上完成。
-
@Wain 我不这么认为,但老实说我并不完全确定(为我的无知道歉)。在弹出之前我所做的就是向 salesforce API 发送请求,以使用详细信息屏幕上的文本字段中的数据进行更新。详细控制器被设置为 API 调用的委托,因此当我尝试弹出控制器时,更新成功。这能解释吗?还是您希望我也将原始问题中的所有代码都转储?
标签: ios iphone objective-c uitableview uinavigationcontroller