如何消除“两阶段旋转”警告?

11

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

类似于这样:

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

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

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

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

还是说我应该找另一种方法来完成这个操作?

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


这是另一种实现方式。不要使用控制器,而是创建自己的UIControllerView并将UITabBar附加到其中。链接中有源代码参考(位于GIT上)。 - TamusJRoyce
7个回答

14

你遇到的问题是因为你在意图之外使用UITabBarController。它只用作根控制器,如果需要类似选项卡的控件,请使用工具栏(toolbar)。

大约半年前,我也遇到了完全相同的问题。如果你这样使用,还会遇到其他问题。

UITabBarController文档

由于UITabBarController类继承自UIViewController类,因此选项卡控制器有自己的视图,可以通过view属性访问。在部署选项卡界面时,必须将此视图安装为窗口的根视图。与其他视图控制器不同,选项卡接口不应安装为另一个视图控制器的子级。


话虽如此,自从iOS 2以来,我一直在UINavigationController中使用UITabBarController,从未遇到过任何问题。 - Pascal
3
如何正确制作登录界面并在登录后跳转到UITabBarController?除了在iOS7中控制台上的消息外,我没有看到使用UINavigationController时可能存在其他问题。 - Cristi Băluță
@LuckyLuke 如果我有一个自定义需求,要以模态方式呈现uitabbarcontroller,我该怎么办? - S.J
@CristiBăluță 我使用了一个UITabBarController,在第一个且唯一的标签中有一个登录界面。一旦用户成功登录,我会根据他们的权限打开其他标签页,使用以下代码:[self setViewControllers:hasAccess animated:Yes],其中hasAccess是一个视图控制器的NSMutableArray。 - JSWilson
但在iOS8中它可以工作。当将选项卡控制器放入导航控制器中时,我不会收到错误。 - supNate

12

如果您只添加了一个空的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;
}

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


这个问题的原因非常难以察觉。很好发现!我是这样修复的: UIViewController *tempViewController = [[UIViewController alloc] init]; UINavigationController *tempNavController = [[UINavigationController alloc] initWithRootViewController:tempViewController]; self.tabBarViewController.viewControllers = @[tempNavController]; 我不再收到警告了!但是代码有点凌乱。 - Sam
如果在将UITabBarController声明为UIWindow的rootViewController之前添加一个子视图控制器,警告消息就会消失。 - SolidSun

12

当我子类化UITabBarController,但忘记在我的类中调用基类的viewWillAppear:方法时,我得到了相同的警告。

- (void) viewWillAppear:(BOOL)animated {

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

  ...

}

2
+1 谢谢 - 我从没想过那会导致这个警告 - anneblue
谢谢。这么简单,很容易被忽视。正如anneblue所说,如果没有她的提示,我自己可能要花很长时间才能弄清楚。 - Pega88

2
我有一个应用程序,其中UITabBarController是根视图控制器。根据应用内购买情况,子视图控制器不同。
在我的NIB中,我没有任何子视图控制器的UITabBarController。我在application:didFinishLaunchingWithOptions:中添加了子视图控制器。
这导致出现“两阶段”旋转警告。一旦我在NIB中添加了一个单独的子视图控制器到选项卡栏控制器中,它就消失了。

0

以下是与两阶段动画警告相关的问题:

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

但是改变顺序帮助我消除了警告。
self.tabBarController.selectedIndex = 0;
self.window.rootViewController = self.tabBarController;

希望这能有所帮助。

0

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

在我的情况下,我已经为UITabBarController添加了2个子控制器。

出于某种奇怪的原因,我所需要做的就是在添加完这2个子控制器后加上

[self.window makeKeyAndVisible];

即可。


0

Oliver的回答对我很有帮助...虽然有点意思...在我将viewWillAppear:animated方法添加到子类化的tabviewcontroller之前,我没有遇到任何问题...但是在那时,一切都变得混乱了,直到按照Oliver建议的添加[super viewWillAppear:animated]语句后才解决了问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接