对<uinavigationcontroller的开始/结束外观转换的不平衡调用:0xa98e050 =“”> </uinavigationcontroller:>

时间:2013-01-19 09:21:53

标签: iphone ios objective-c ios6 uinavigationcontroller

在编译我得到的代码时

  

<UINavigationController: 0xa98e050>

的开始/结束外观转换的不平衡调用

警告。

这是我的代码

KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
passcodeController.delegate = self;

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];

5 个答案:

答案 0 :(得分:57)

我知道这是一个古老的问题,但为了那些再次遇到这个问题的人,这就是我所发现的。

首先,问题并未说明新viewController被调用的位置 我怀疑这是从-(void)viewDidLoad

调用的

将相应的代码移至-(void)viewDidAppear:,问题应该消失。

这是因为在-viewDidLoad处,视图已加载,但尚未显示,且动画和视图尚未完成。

如果您的目的是推动窗户,请在窗口出现并涂漆后再进行操作。

如果您发现自己使用计时器来控制系统行为,请问问自己您做错了什么,或者如何更好地做到这一点。

答案 1 :(得分:17)

我发现如果您尝试在前一个事务(动画)正在进行时推送新的视图控制器,则会出现此问题。

无论如何,我认为,presentModalViewController问题,设置animated:NO可能会解决您的问题

[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:NO];

其他选项是:

选择NSTimer并调用上面的代码可能 0.50到1 秒。这也是有用的技巧。所以你以前的viewController已经完成了它的动画。

答案 2 :(得分:9)

当您尝试在先前包含的viewController完成动画之前加载新的viewController时,会出现此警告。如果您打算这样做,只需将代码添加到dispatch_async(dispatch_get_main_queue()块:

dispatch_async(dispatch_get_main_queue(), ^(void){
        [(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];
});

并且警告将消失。

答案 3 :(得分:3)

现代解决方案可能是这样的:

double delayInSeconds = 0.5;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *   NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self.window.rootViewController presentViewController:yourVC animated:YES completion:nil];
});

答案 4 :(得分:1)

您没有提供太多上下文,因此我假设您在呈现密码视图控制器时会在启动时发生此错误。

为了摆脱这个警告,我将app delegate注册为导航根视图控制器的代表:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ((UINavigationController *)self.window.rootViewController).delegate = self;
    return YES;
}

然后我在navigationController:didShowViewController:animated:中使用dispatch_once

呈现模态视图控制器
- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
        passcodeController.delegate = self;

        UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
        [(UIViewController *)self.delegate presentViewController:passcodeNavigationController animated:YES completion:nil];
    });
}

由于在根视图控制器出现后调用navigationController:didShowViewController:animated:不平衡调用开始/结束外观转换警告就消失了。