Ios 导航更改不会改变';在回调块内调用时不会触发
我的任务是在更大的Objective-C应用程序中进行一些小的调整 我试图做的是,当用户单击列表中的某个项目时,将执行一个计算,根据结果,导航应弹出回root并显示一个错误。因为我无法访问完成计算的类中的NavigationController,所以我尝试传递一个“回调块” 我一直传递该块,直到计算完成并调用回调。它似乎可以正常工作,因为我可以在日志中看到是或否,但由于某种原因导航没有被触发。它似乎也不是一个范围问题,因为self似乎是同一个引用(我甚至尝试为navigationController创建一个新变量,但这也没有帮助) 如果我取出Ios 导航更改不会改变';在回调块内调用时不会触发,ios,objective-c,uinavigationcontroller,Ios,Objective C,Uinavigationcontroller,我的任务是在更大的Objective-C应用程序中进行一些小的调整 我试图做的是,当用户单击列表中的某个项目时,将执行一个计算,根据结果,导航应弹出回root并显示一个错误。因为我无法访问完成计算的类中的NavigationController,所以我尝试传递一个“回调块” 我一直传递该块,直到计算完成并调用回调。它似乎可以正常工作,因为我可以在日志中看到是或否,但由于某种原因导航没有被触发。它似乎也不是一个范围问题,因为self似乎是同一个引用(我甚至尝试为navigationControll
[self.navigationController popToRootViewControllerAnimated:YES]
并将其移出回调(以便立即执行),它可以完美地工作。但显然这对我没有帮助,因为当时我还没有决定是否需要回去
我是否遗漏了一些明显的东西,或者是否有办法(在调试器中)查看动画为什么没有被触发
谢谢你的帮助
编辑:
我在测试时尝试了这一点,但它似乎也不起作用:
[self.baseBehaviour processInfo:self.info completion: ^(BOOL finished) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(finished ? @"YES" : @"NO");
// pop back to root controller
[self.navigationController popToRootViewControllerAnimated:YES];
});
}];
编辑2:
看来这毕竟可能是一个范围问题。我注意到,当我这样做时,调试器中的值是零
NSArray *viewCtrls = [self.navigationController viewControllers]; // 3 elements
[self.baseBehaviour processInfo:self.info completion: ^(BOOL finished) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(finished ? @"YES" : @"NO");
// pop back to root controller
NSArray *viewCtrls = [self.navigationController viewControllers]; // nil
[self.navigationController popToRootViewControllerAnimated:NO];
});
}];
如何将某些内容“传递”到回调块,如navigationController?在主线程中执行,例如:
dispatch_async(dispatch_get_main_queue(), ^{[self.navigationController popToRootViewControllerAnimated:YES];});
这可能有助于u在主线程中执行此操作,例如:
dispatch_async(dispatch_get_main_queue(), ^{[self.navigationController popToRootViewControllerAnimated:YES];});
这可能有助于u完成块在次线程中执行。推送或弹出视图控制器必须在主线程中。因此,在那里创建一个主线程并弹出到根控制器
[self.baseBehaviour processInfo:info completion: ^(BOOL finished) {
NSLog(finished ? @"YES" : @"NO");
// pop back to root controller
dispatch_async(dispatch_get_main_queue(), ^{[self.navigationController popToRootViewControllerAnimated:YES];});
}];
您在评论中的问题:-是否可能因为另一个动画(推送)已在运行而未触发动画?
回答:-如果您面临动画小故障问题,则在弹出视图控制器时传递否
,如下所示:-
dispatch_async(dispatch_get_main_queue(), ^{[self.navigationController popToRootViewControllerAnimated:NO];});
完成块将在次线程中执行。推送或弹出视图控制器必须在主线程中。因此,在那里创建一个主线程并弹出到根控制器
[self.baseBehaviour processInfo:info completion: ^(BOOL finished) {
NSLog(finished ? @"YES" : @"NO");
// pop back to root controller
dispatch_async(dispatch_get_main_queue(), ^{[self.navigationController popToRootViewControllerAnimated:YES];});
}];
您在评论中的问题:-是否可能因为另一个动画(推送)已在运行而未触发动画?
回答:-如果您面临动画小故障问题,则在弹出视图控制器时传递否
,如下所示:-
dispatch_async(dispatch_get_main_queue(), ^{[self.navigationController popToRootViewControllerAnimated:NO];});
只需在主线程上运行它
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:true];
});
只需在主线程上运行它
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:true];
});
完成块将在次线程中执行。因此,在那里创建一个主线程(
NSOperationQueue
或NSThread
),然后跳转到根控制器。很遗憾,我用另一个代码片段更新了我的答案,但它也不起作用。是否有可能因为另一个动画(推送)已在运行而未触发动画?在最后一个参数中,通过NO
,而不是通过YES。我还编辑了。完成块将在次线程中执行。因此,在那里创建一个主线程(NSOperationQueue
或NSThread
),然后跳转到根控制器。很遗憾,我用另一个代码片段更新了我的答案,但它也不起作用。是否有可能因为另一个动画(推送)已在运行而未触发动画?在最后一个参数中,通过NO
,而不是通过YES。我也编辑过。谢谢你的回答,我试过了,可惜没有成功。请检查rootViewController
,它是想要的吗?我想是的,否则当我把它放在回调之外时它也不会起作用,对吧?谢谢你的回答,我试过了,可惜没有成功。请检查rootViewController
,它是想要的吗?我想是的,否则当我把它放在回调之外时它也不会工作,对吧?谢谢你的快速响应。我更新了我的答案,可惜它不起作用。那仍然不起作用。问题是它根本不会被触发,所以根本不会返回。如果另一个导航已在运行,是否会阻止导航更改?其他导航是什么?其他导航控制器也在推送或弹出视图控制器?我更新了我的答案,也许这毕竟是一个范围问题。感谢您的快速响应。我更新了我的答案,可惜它不起作用。那仍然不起作用。问题是它根本不会被触发,所以根本不会返回。如果另一个导航已在运行,是否会阻止导航更改?其他导航是什么?其他导航控制器也在推送或弹出视图控制器?我更新了我的答案,也许这毕竟是一个范围问题。