【问题标题】:Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0xa98e050>对 <UINavigationController: 0xa98e050> 的开始/结束外观转换的不平衡调用
【发布时间】:2013-01-02 23:42:27
【问题描述】:

在编译我得到的代码时

“对&lt;UINavigationController: 0xa98e050&gt; 的开始/结束外观转换的不平衡调用”

警告。

这是我的代码

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

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

【问题讨论】:

    标签: iphone ios objective-c ios6 uinavigationcontroller


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 这对我来说是正确的答案,也可以简单地解释发生了什么。我做了同样的事情,并在前一个视图的动画完成之前以模态方式呈现了一个视图。
    • @Mark Travis:在我的情况下,我无法从“viewDidAppear”调用。我正在使用 ContainerViewClass 并根据某些操作切换视图控制器。这个警告信息总是会出现。 stackoverflow.com/questions/27632106/…
    • 这是正确的解决方案,甚至在至少一个 Apple 演示(即 MyImagePicker)中被发现是必需的,其中错误消息 ViewController 会导致这样的警告。
    • 我确实在viewDidLoad 中调用它并将该代码移至viewDidAppear 解决了它。这是正确的答案。
    • 使用 Xcode 9.1 和 swift 4 以及无故事板项目(我以编程方式执行所有操作)即使我从 ViewDidAppear 中展示了一个 viewController,我也遇到了问题。解决了将呈现的控制器 ViewDidLoad 的代码插入异步块 DispatchQueue.main.asyncAfter(deadline: when) {} 的问题。
    【解决方案2】:

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

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

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

    其他选项是:

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

    【讨论】:

    • 是的,我试图引入一个计时器;我只是认为这是一个 hack,但如果这是公认的解决方案....我担心我的代码中有一些根本性的错误,即我没有按照众所周知的苹果方式进行操作,因此出现了错误。跨度>
    • 安德烈亚斯。如果有“很多其他更好的方法”,那么为什么不在这里指定它们。因为您的评论没有建设性。
    【解决方案3】:

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

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

    警告就会消失。

    【讨论】:

      【解决方案4】:

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

      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];
      });
      

      【讨论】:

        【解决方案5】:

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

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

        - (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:,因此对开始/结束外观转换的不平衡调用警告消失了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-30
          • 1970-01-01
          • 2016-05-28
          • 2012-01-23
          • 1970-01-01
          相关资源
          最近更新 更多