奇怪的警告解雇模态视图控制器

时间:2012-09-04 09:57:59

标签: iphone ios cocoa-touch ios5 ios6

我正在使用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];
}

生成的警告是警告:

尝试从视图控制器中解除< UINavigationController:0x1ed91620>正在进行演示或解雇!

关于那个的任何线索?

由于

5 个答案:

答案 0 :(得分:28)

我意识到这是一个迟到的答案,但也许这会帮助其他人寻找解决方案,这就是我所做的:

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

对我来说,我发现这行代码被多次调用,我无法找到原因,所以这是最容易修复的。

答案 1 :(得分:14)

感谢JDx让我走上正轨。我对其进行了调整以形成此解决方案,该解决方案将在不使用iOS 6中弃用的功能的情况下删除警告:

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

答案 2 :(得分:0)

我发现这种方法不可靠 - 比如五分之一,我仍然会看到错误。

我的解决方案是使用完成块来设置一个标志,该标志控制是否可以安全解散 - 这样您就不需要检查视图是否被解除。

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

在发生解雇的代码位中,只需检查标志:

-(void)dismisser {
    :
    if (self.canDismiss) {
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    :
}

嘿presto,没有更多的错误!

答案 3 :(得分:0)

针对iOS6,这对我有用:

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

答案 4 :(得分:0)

完成解雇方法后,你可以做任何你想做的事情:

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