iOS5 SplitViewController оставляет BarButton видимым в горизонтальном режиме при запуске приложения
У меня есть UISplitViewController с UIViewController в качестве главного и UINavigationController в качестве моего контроллера данных (который содержит фактический DetailsController в качестве его rootController).
В iOS5 при запуске приложения (удерживая устройство в альбомной ориентации) я добавляю представление splitViewController в свое окно, но затем я представляю loginController поверх splitViewController, например, так:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
KRMasterViewController *masterViewController = [[[KRMasterViewController alloc] initWithNibName:@"KRMasterViewController" bundle:nil] autorelease];
UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
KRDetailViewController *detailViewController = [[[KRDetailViewController alloc] initWithNibName:@"KRDetailViewController" bundle:nil] autorelease];
UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
self.splitViewController = [[[UISplitViewController alloc] init] autorelease];
self.splitViewController.delegate = detailViewController;
self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController, detailNavigationController, nil];
[self.window addSubview:self.splitViewController.view];
LoginController *controller=[[LoginController alloc]
initWithNibName:@"LoginController" bundle:nil];
[self.splitViewController presentModalViewController:controller animated:false];
[self.window makeKeyAndVisible];
return YES;
}
Как вы можете видеть, detailsController является делегатом моего splitViewController. Проблема в iOS4, перед отображением loginController, метод делегата:
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)popoverController
Затем, когда я отклоняю loginController, вызывается метод делегата:
- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
вызывается. Я предполагаю, что iOS очень поздно понимает, что я нахожусь в пейзаже, но выясняю, прежде чем я попал в detailController, поэтому все было круто В iOS 5 второй метод не вызывается к тому времени, когда я добираюсь до splitViewController. Это означает, что я остался с barButtonItem видимым в альбомной ориентации. Как ни странно, если я поверну в портретную, а затем в альбомную, методы с этого момента будут вызываться правильно. Кто-нибудь когда-либо испытывал это раньше? Какие-либо решения?
2 ответа
В итоге я переключил корневой контроллер с контроллера навигации (при входе в систему) на контроллер splitview для главного меню:
-(void)goToLogin{
self.rootSplitController=nil;
UINavigationController* navController=[[UINavigationController alloc]init];
navController.navigationBarHidden = true;
self.rootNavController=navController;
[navController release];
LoginController *loginController=[[LoginController alloc]init];
[self.rootNavController pushViewController:loginController animated:false];
[loginController release];
[self.window addSubview:self.rootNavController.view];
}
-(void)goToMain{
self.rootNavController=nil;
MasterController *masterViewController = [[[MasterController alloc]
initWithNibName:@"MasterController" bundle:nil] autorelease];
UINavigationController *masterNavigationController = [[[UINavigationController alloc]
initWithRootViewController:masterViewController] autorelease];
masterNavigationController.navigationBarHidden=true;
DetailsController *detailViewController = [[[DetailsController alloc]
initWithNibName:@"DetailsController" bundle:nil] autorelease];
UINavigationController *detailNavigationController = [[[UINavigationController alloc]
initWithRootViewController:detailViewController] autorelease];
detailNavigationController.navigationBarHidden=true;
self.rootSplitController = [[[UISplitViewController alloc] init] autorelease];
self.rootSplitController.delegate = detailViewController;
self.rootSplitController.viewControllers = [NSArray arrayWithObjects:
masterNavigationController, detailNavigationController, nil];
[self.window addSubview:self.rootSplitController.view];
}
У меня была похожая проблема. После запуска приложения я представляю Логин modalVC. Но когда я отклонил его, BarButtonItem в detailViewController все еще виден.
Просто используйте
[self performSelector:@selector(presentLogin) withObject:nil afterDelay:0.1]
и он волшебным образом начнет работать.