奇怪的警告消息导致模态视图控制器消失

19

我正在开发iOS 6应用。 我的应用程序有一个标准的导航控制器,嵌入了CustomViewController。 在这个控制器中,我像这样创建一个模态视图:

-(IBAction)presentModalList:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    StationsListViewController *list = [storyboard instantiateViewControllerWithIdentifier:@"StationsListViewController"];
    [list setStationsData: [self.stationsData allValues]];
    [self presentModalViewController:list animated:YES];
}

模态控制器显示得很好,但是解除控制器时会产生警告。 在该控制器中的解除方法如下:

-(IBAction)backToMap
{
    [self dismissModalViewControllerAnimated:YES];
}

生成的警告是:Warning:

试图在进行呈现或解散操作时从视图控制器 < UINavigationController: 0x1ed91620 > 中解雇!

有什么线索吗?

谢谢


相关 - https://dev59.com/pHM_5IYBdhLWcg3wWRyV - ChrisF
5个回答

28

我知道这个答案来晚了,但也许对于其他正在寻找解决方案的人有所帮助,以下是我的做法:

-(IBAction)backToMap
{
    if (![[self modalViewController] isBeingDismissed])
        [self dismissModalViewControllerAnimated:YES];
}

对我来说,我发现那行代码被多次调用,但我找不出原因,这是最简单的解决方法。


6
我也遇到了这个问题。可能出现的情况是你的 dimissModalViewControllerAnimated: 调用被放在回调(IBAction)方法中,而这个方法是由模态视图上的取消按钮直接或间接触发的,模态视图已经处理了关闭操作。因此,dismissModalViewControllerAnimated: 可能是重复的,可以将其删除。 - smileyborg
1
我曾经遇到过类似的问题,但是它是由于一个视图控制器被呈现后几乎立即被解除(因此解除是在呈现动画期间进行的)所致。因此,我不得不检查 isBeingPresented - Olie
很奇怪。我认为@smileyborg有点眉目了。但我不明白为什么它会自动消失?我只是执行了一个取消操作,而且我不需要直接关闭它? - huggie

14

感谢JDx让我走上正确的道路。我根据这个解决方案进行了改进,它可以在不使用iOS 6中已被弃用的函数的情况下消除警告:

感谢JDx让我走上正确的道路。我根据此方案进行了调整,可消除警告且无需使用在iOS 6中已被弃用的函数:

-(IBAction)backToMap
{
    if (![self.presentedViewController isBeingDismissed]) {
        [self dismissViewControllerAnimated:YES completion:^{}];
    }
}

0

我发现这种方法不可靠 - 五次中有一次我仍然会看到错误。

我的解决方案是使用完成块来设置一个标志,该标志控制是否安全地关闭视图 - 这样您就不需要检查视图是否正在关闭。

-(IBAction)presentModalView:(id)sender {
    :
    self.canDismiss = NO;
    [self presentViewController:aVC animated:YES completion:^{ 
      self.canDismiss = YES; 
     }];
    :
}

在代码的 dismiss 发生的那一部分,只需检查标志即可:
-(void)dismisser {
    :
    if (self.canDismiss) {
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    :
}

嘿,妙不可言,再也没有错误了!

0

在 dismiss 方法完成后,您可以随意进行任何操作:

-(IBAction)backToMap
{
    [self dismissViewControllerAnimated:YES
                             completion:^{
                                 //Do something here
                             }];
}

0

针对iOS6,以下是我测试通过的代码:

if (![self.presentedViewController isBeingDismissed]) 
    [self.presentedViewController dismissViewControllerAnimated:YES
                                                     completion:nil];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接