gpt4 book ai didi

ios - 除非我使用调度主队列,否则为什么 PopViewControllerAnimated 会崩溃?

转载 作者:行者123 更新时间:2023-12-01 16:00:12 26 4
gpt4 key购买 nike

为了提供一些上下文,我有一个简单的 UITableViewController,它用数据填充 UITableView。选择一行后,我会通过创建自定义 UIViewController 的新实例并将其推送到导航 Controller 上来进入详细信息屏幕:

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

细节 Controller 本身有几个文本字段和一个更新按钮。当按下更新按钮时,我会更新我的模型,然后尝试使用以下命令导航回之前的 UITableViewController:
[self.navigationController popViewControllerAnimated:YES];

当我这样做时,应用程序崩溃了,我收到一个错误,就像尼克在之前的 SO 帖子中遇到的错误一样: Error when dismissing view controller - 关于 -[UIKeyboardTaskQueue waitUntilAllTask​​sAreFinished] 中的断言失败的一些信息(如果需要,我可以提供更多详细信息)。

在调用 pop 来解决这个问题之前,我尝试做一些事情
[self.view endEditing:YES];

以及在每个 UITextfield 上使用 resignFirstResponder。两者都没有做任何事情。

但是,我发现如果我使用主线程:
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popViewControllerAnimated:YES];
});

它似乎工作得很好。我不知道为什么会这样,并且对它为什么会崩溃并没有非常明确的理解。我假设它与我的细节 Controller 在从堆栈中删除后尝试做某事有关。

无论如何,我希望这里有人可以帮助我理解为什么这似乎有效,如果这对我来说是解决这个问题的合理方式。

最佳答案

有时异步 API 请求不会回调主线程上的委托(delegate)。这可能有几个原因,但如果回调不在主线程上,那么您需要确保在对 UI 进行任何更新之前切换到主线程。

作为检查,您可以确定您当前是否在主线程上运行:

if ([NSThread isMainThread]) {
NSLog(@"Yay!");
} else {
NSLog(@"Humph, switching to main");
dispatch...
}

关于ios - 除非我使用调度主队列,否则为什么 PopViewControllerAnimated 会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com