У меня есть UISplitViewController с UIViewController в качестве главного и UINavigationController в качестве моего контроллера данных (который содержит фактический DetailsController в качестве корневого контроллера).
В 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 видимым в альбомной ориентации. Как ни странно, если я поверну в портретную, а затем в альбомную, методы с этого момента будут вызываться правильно. Кто-нибудь когда-либо испытывал это раньше? Любые решения?