【问题标题】:How to eliminate "two-stage rotation" warning?如何消除“两级轮换”警告?
【发布时间】:2011-07-09 18:31:35
【问题描述】:

我的窗口的 rootViewController 是 UINavigationController 然后..在这个导航控制器的rootViewController中,我弹出一个模态视图(一个UITabBarController)

类似这样的:

UIWindow
->UINavigationController
-->MyFirstViewController<--In this class I run following code
[self.navigationController presentModalViewController:tabController animated:YES];

然后调试器警告:当旋转多个视图控制器或视图控制器不是窗口委托时,不支持使用两阶段旋转动画

但是,如果模态视图不是 tabController,则不会出现此警告。

当我在导航控制器中弹出 tabController 模式视图时,此行为会对应用程序造成什么损害?

或者我应该找到另一种方法来做到这一点?

我在这个网站上发现了几个类似的问题,但我不明白...

【问题讨论】:

  • stackoverflow.com/questions/576764/… - 这是另一种方法。不要使用控制器,而是制作自己的 UIControllerView 并将 UITabBar 附加到它。链接引用了源代码(位于 GIT 上)。

标签: iphone ios xcode


【解决方案1】:

原因是您使用的 UITabBarController 超出了它的预期用途。它仅用作根控制器,如果您需要类似于标签栏使用工具栏的东西。大约半年前,我遇到了确切的问题。不幸的是,如果你这样使用它,你也会遇到其他问题。

UITabBarController documentation

因为 UITabBarController 类 继承自 UIViewController 类,标签栏控制器有他们的 可通过以下方式访问的自己的视图 视图属性。当部署一个 标签栏界面,必须安装 这个视图作为你的窗口的根。 与其他视图控制器不同,选项卡 酒吧界面永远不应该 作为另一个视图的子项安装 控制器。

【讨论】:

  • 很棒的答案!解决了我的问题。
  • 也就是说,自 iOS 2 以来,我在 UINavigationController 中使用了 UITabBarController,并且从未遇到过问题。
  • 登录屏幕和登录后转到 UITabBarController 的正确方法是什么?除了来自 ios7 控制台的消息外,我看不到在 UINavigationController 中使用控制器的任何其他问题
  • @LuckyLuke 如果我有自定义要求以模态方式呈现 uitabbarcontroller 怎么办?我该怎么办?
  • @CristiBăluță 我使用 UITabBarController,它在第一个也是唯一一个选项卡中有一个登录屏幕。用户成功登录后,我会根据他们的权限使用以下代码打开其他选项卡: [self setViewControllers:hasAccess animated:Yes] 其中 hasAccess 是视图控制器的 NSMutableArray。
【解决方案2】:

如果您只添加一个没有任何子控制器的空白 UITabbarController 也会发生这种情况,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    //Tab bar controller
    UITabBarController* tabBarController = [[UITabBarController alloc] init];    
    [[self window] setRootViewController:tabBarController];

    [self.window makeKeyAndVisible];
    return YES;
}

如果在将子视图控制器声明为 UIWindow 的 rootViewController 之前将子视图控制器添加到 UITabBarController,则警告将消失。

【讨论】:

  • 其原因被隐藏得如此之好。好眼力!我这样修复:UIViewController *tempViewController = [[UIViewController alloc] init];UINavigationController *tempNavController = [[UINavigationController alloc] initWithRootViewController:tempViewController];self.tabBarViewController.viewControllers = @[tempNavController];我不再收到警告!但是有点乱。
  • +1 表示“如果您在将子视图控制器添加到 UITabBarController 之前将其声明为 UIWindow 的 rootViewController,则警告将消失。”
【解决方案3】:

我在继承 UITabBarController 时收到了同样的警告,但忘记在我自己的类中调用基类的 viewWillAppear: 方法。

- (void) viewWillAppear:(BOOL)animated {

  [super viewWillAppear:animated]    // <--- adding this fixed the warning

  ...

}

【讨论】:

  • +1 谢谢 - 我从没想过会导致这个警告
  • 谢谢。如此简单,如此容易被忽视。事实上,正如 anneblue 所说,我自己要花很长时间才能弄清楚这一点。
【解决方案4】:

我有一个应用程序,其中 UITabBarController 是根视图控制器。根据应用内购买,子视图控制器是不同的。

在我的 NIB 中,UITabBarController 没有任何子视图控制器。我在application:didFinishLaunchingWithOptions:中添加了子视图控制器

这导致出现警告“两阶段”轮换。一旦我将一个子视图控制器添加到 NIB 中的标签栏控制器,它就消失了。

【讨论】:

    【解决方案5】:

    @Maciej Swic 的回答对我有所帮助。

    就我而言,UITabBarController 已经有 2 个孩子了。

    出于某种奇怪的原因,我只需要放

    [self.window makeKeyAndVisible];

    在我添加了 2 个孩子之后。

    【讨论】:

      【解决方案6】:

      Oliver 的回答对我有用……虽然很有趣……在我向子类 tabviewcontroller 添加 viewWillAppear:animated 方法之前,我没有遇到任何问题……那时,一切顺利乱七八糟,直到通过添加 Oliver 建议的 [super viewWillAppear:animated] 语句来修复它...

      【讨论】:

        【解决方案7】:

        有以下顺序的两阶段动画警告问题:

        self.window.rootViewController = self.tabBarController;
        self.tabBarController.selectedIndex = 0;
        

        但是更改顺序可以帮助我消除警告。

        self.tabBarController.selectedIndex = 0;
        self.window.rootViewController = self.tabBarController;
        

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2014-01-18
          • 1970-01-01
          • 2021-01-16
          • 2022-01-21
          • 2021-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-14
          相关资源
          最近更新 更多