有关RootViewController设置的问题和Unbalanced calls to begin/end appearance transitions for

问题

  • 今天做项目时遇到了一个问题,我想做一个登陆页面,在用户输入了登录名和密码后跳转到app主界面,最开始用的是在方法中新建一个appdelegate对象,再将其中的window属性设置Tabbar为rootViewController,但是报错。

原来的方法

//新建appDelegate对象
AppDelegate *app = [[AppDelegate alloc] init];
//初始化window
app.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
app.window.backgroundColor = WHITE;
[app.window makeKeyAndVisible];
//创建tabbar
Tcq_Tabbar *tabbar = [[Tcq_Tabbar alloc] init];
CYLTabBarController *tcq_Tab = tabbar.tcq_Tabbar;
//设置为rootzViewController
[app.window setRootViewController:tcq_Tab];
  • 但是运行之后,XCode报了一个错

Unbalanced calls to begin/end appearance transitions for <CYLTabbarController>

  • 上网查了一下发现是因为当当前界面的动画没有做完时,又开始做下一个动画,导致界面不变,如果按照原来的方法来解决的话就必须在自定义的tabbar中重写viewWillAppear方法,这样的话就要更改CYLTabbarController的源码,过于麻烦。
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]; 
}
  • 想来应该是获取window的方式不对,然后就在网上查阅资料发现了另外一种方法获取window。

新方法

if (@available(iOS 13.0, *)) {
        //在ios13后通过这种方式获取window
        window = [UIApplication sharedApplication].windows[0];
    } else {
        window = [UIApplication sharedApplication].delegate.window;
    }
  • 然后将修改后的代码加入项目,成功跳转✅
Tags: