21

在编译我得到的代码时

“开始/结束外观转换的不平衡呼叫<UINavigationController: 0xa98e050>

警告。

这是我的代码

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

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

5 回答 5

63

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

首先,这个问题没有说明 newviewController被调用的位置。
我怀疑这是从-(void)viewDidLoad

将适当的代码移到-(void)viewDidAppear:,问题应该会消失。

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

如果您的意图是推动窗口,请在窗口呈现并绘制后执行。

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

于 2013-12-02T01:06:11.080 回答
18

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

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

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

其他选项是:

上述代码的取值NSTimer和调用时间可能为0.50 到 1秒。这也是有用的技巧。所以你之前的 viewController 已经完成了它的动画。

于 2013-01-19T09:35:26.923 回答
10

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

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

警告就会消失。

于 2016-03-01T20:14:45.563 回答
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];
});
于 2013-11-16T11:50:58.457 回答
1

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

为了摆脱这个警告,我将应用程序委托注册为导航根视图控制器的委托:

- (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:在根视图控制器确实出现后调用,因此对开始/结束外观转换警告的不平衡调用消失了。

于 2015-01-22T11:08:34.797 回答