iOS5 SplitViewController оставляет BarButton видимым в горизонтальном режиме при запуске приложения - PullRequest
1 голос
/ 13 января 2012

У меня есть 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 видимым в альбомной ориентации. Как ни странно, если я поверну в портретную, а затем в альбомную, методы с этого момента будут вызываться правильно. Кто-нибудь когда-либо испытывал это раньше? Любые решения?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2012

В итоге я переключил корневой контроллер с контроллера навигации (при входе в систему) на контроллер 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];
} 
0 голосов
/ 10 февраля 2012

У меня была похожая проблема.После запуска приложения я представляю Логин modalVC.Но когда я отклонил его, BarButtonItem в detailViewController все еще виден.

Просто используйте

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

, и он волшебным образом заработает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...