dismissViewControllerAnimated 在 iOS 9 中不起作用

Posted

技术标签:

【中文标题】dismissViewControllerAnimated 在 iOS 9 中不起作用【英文标题】:dismissViewControllerAnimated not working in iOS 9 【发布时间】:2017-05-13 06:48:50 【问题描述】:

我有一个名为NewsViewControllerUIViewController 子类,它有一个从按钮操作调用的完成块属性。控制器被设置并呈现在另一个视图控制器中,如下所示:

newsViewController.completionBlock = ^
    [self dismissViewControllerAnimated:YES completion:nil];
;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:newsViewController];
[self presentViewController:navigationController animated:YES completion:nil];

ios 10 中,这一切正常,但在 iOS 9 中,视图并没有被关闭。如果我在那里设置断点,它确实会被命中。

我尝试了以下方法但没有成功:

从主线程调用它(同步和异步)

我已经像这样使用 GCD 尝试过:

dispatch_async(dispatch_get_main_queue(), ^
    [self dismissViewControllerAnimated:YES completion:nil];
);

我也尝试过将解除调用放入一个方法然后调用

[self performSelectorOnMainThread:@selector(dismissModalView) withObject:nil waitUntilDone:NO];

我实际上并不认为问题出在线程上,因为从完成块中调用 [NSThread isMainThread] 返回 YES。

延迟调用它

[self performSelector:@selector(dismissModalView) withObject:nil afterDelay:0.1];

在另一个视图控制器上调用关闭

我尝试在navigationControllerself.presentedViewControllerself.presentingViewController 上调用它。

直接从 NewsViewController 调用驳回

在调用完成块的按钮动作中,我直接调用了[self dismissViewControllerAnimated:YES completion:nil]

顺便说一句。只是为了好玩,我尝试从presentViewController 方法的完成块调用dismiss 方法,它确实被解除了。

【问题讨论】:

【参考方案1】:

我终于找到了问题所在,这是非常出乎意料的。问题是NewsViewController 出现在我的登录视图控制器上。此控制器允许用户使用 Touch ID 登录,因此它在其viewDidAppear 方法中请求 Touch ID 提示。显然,这与取消显示的视图相混淆,并且似乎只在 iOS 9 中(嗯,也许不仅如此,但它似乎在 iOS 10 中工作正常)。

【讨论】:

【参考方案2】:

试试下面的代码:

newsViewController.completionBlock = ^
   [self performSelector:@selector(Dismiss) withObject:nil afterDelay:0.3];
;

 -(void)Dismiss

[self dismissViewControllerAnimated:YES completion:^

    ];

【讨论】:

我不确定我会用这个完成什么。使用您的代码,我将在关闭 NewsViewController 后再次显示它。这根本不是我想要的,无论如何它也无法解决我的问题(一开始就无法解雇)。 您需要在完成时将其关闭,然后只在完成块中写入没有任何内容的关闭。 你的代码会给我一个无限循环。在完成块中,您再次呈现相同的视图控制器。因此,当视图被关闭时,它将再次呈现。 正如您从我最初的问题中看到的那样,我已经尝试过这种方法。但无论如何,我现在已经找到了问题的根源。

以上是关于dismissViewControllerAnimated 在 iOS 9 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

dismissViewControllerAnimated:completion: 导致内存崩溃

在当前动画完成之前开始dismissViewControllerAnimated

调用了dismissViewControllerAnimated,但没有解除ViewController

状态恢复后,dismissViewControllerAnimated 没有使用相同的动画

dismissViewControllerAnimated() 不会关闭视图控制器

dismissViewControllerAnimated:completion: 方法替换在 Xcode4.6.1 上不起作用