Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 导航更改不会改变';在回调块内调用时不会触发_Ios_Objective C_Uinavigationcontroller - Fatal编程技术网

Ios 导航更改不会改变';在回调块内调用时不会触发

Ios 导航更改不会改变';在回调块内调用时不会触发,ios,objective-c,uinavigationcontroller,Ios,Objective C,Uinavigationcontroller,我的任务是在更大的Objective-C应用程序中进行一些小的调整 我试图做的是,当用户单击列表中的某个项目时,将执行一个计算,根据结果,导航应弹出回root并显示一个错误。因为我无法访问完成计算的类中的NavigationController,所以我尝试传递一个“回调块” 我一直传递该块,直到计算完成并调用回调。它似乎可以正常工作,因为我可以在日志中看到是或否,但由于某种原因导航没有被触发。它似乎也不是一个范围问题,因为self似乎是同一个引用(我甚至尝试为navigationControll

我的任务是在更大的Objective-C应用程序中进行一些小的调整

我试图做的是,当用户单击列表中的某个项目时,将执行一个计算,根据结果,导航应弹出回root并显示一个错误。因为我无法访问完成计算的类中的NavigationController,所以我尝试传递一个“回调块”

我一直传递该块,直到计算完成并调用回调。它似乎可以正常工作,因为我可以在日志中看到是或否,但由于某种原因导航没有被触发。它似乎也不是一个范围问题,因为self似乎是同一个引用(我甚至尝试为navigationController创建一个新变量,但这也没有帮助)

如果我取出
[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
,它是想要的吗?我想是的,否则当我把它放在回调之外时它也不会工作,对吧?谢谢你的快速响应。我更新了我的答案,可惜它不起作用。那仍然不起作用。问题是它根本不会被触发,所以根本不会返回。如果另一个导航已在运行,是否会阻止导航更改?其他导航是什么?其他导航控制器也在推送或弹出视图控制器?我更新了我的答案,也许这毕竟是一个范围问题。感谢您的快速响应。我更新了我的答案,可惜它不起作用。那仍然不起作用。问题是它根本不会被触发,所以根本不会返回。如果另一个导航已在运行,是否会阻止导航更改?其他导航是什么?其他导航控制器也在推送或弹出视图控制器?我更新了我的答案,也许这毕竟是一个范围问题。