简体   繁体   中英

iOS5 SplitViewController leaves BarButton visible while in landscape view on app startup

I have a UISplitViewController with a UIViewController as master and a UINavigationController as my details controller (which contains an actual DetailsController as it's rootController).

In iOS5, at app startup (holding the device in landscape view), I add the splitViewController's view to my window but then I present a loginController on top of the splitViewController like this:

- (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;
}

As you can see the detailsController is my splitViewController's delegate. The problem is in iOS4, before the loginController gets displayed, the delegate method:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem 
       forPopoverController:(UIPopoverController *)popoverController

is called then when I dismiss the loginController the delegate method:

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

gets called. I guess iOS realizes really late that I'm in landscape but figures out before I got to the detailController so everything was cool. In iOS 5, the second method does not get called by the time I get to the splitViewController. This means I'm left with the barButtonItem visible in landscape view. Funny enough, if I rotate to portrait then back to landscape, the methods gets called properly from then on. Anyone ever experienced this before? Any solutions?

I ended up switching the root controller from being a navigation controller (when logging in) to a splitview controller for the main menu:

-(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];
} 

I've had similar problem. After app launch I present Login modalVC. But when I dismiss it, the BarButtonItem in detailViewController is still visible.

Just use

[self performSelector:@selector(presentLogin) withObject:nil afterDelay:0.1]

and it will magically start working.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM