2011-11-07 4 views
2

J'ai un onglet avec splitviewcontroller sur chaque élément. J'ai utilisé une sous-classe de ce site https://github.com/grgcombs/IntelligentSplitViewController et dans iOS 4 tout a bien fonctionné, mais dans iOS 5, j'ai un problème. Quand je démarre l'application en mode portrait, puis changez en paysage et allez au deuxième élément dans la barre d'onglets, puis à nouveau passer en mode portrait et cliquez sur le popover, puis rejeter le popover, allez au premier élément dans tabbar, encore popover ouvert et changer pour le paysage, la vue principale disparaît et Popover est encore visible. Quelqu'un at-il une idée de comment le réparer?UISplitViewController dans UITabBarController dans iOS 5

Répondre

1

J'ai travaillé sur la résolution du même problème. Au lieu d'utiliser la sous-classe UISplitViewController que vous indiquez, j'ai créé une sous-classe UITabBarController qui propage proprement les messages de rotation à tous les UISplitViewControllers qu'elle contient. Cela maintient l'état interne correct des UISplitViewControllers. Cependant, l'une des méthodes de délégué de SplitViewController n'est pas appelée si le SplitViewController n'est pas visible, donc je gère cela dans le contrôleur de vue détaillée. J'ai confirmé cela fonctionne dans iOS5.0 - iOS6.1

OSTabBarController.m

#import "OSTabBarController.h" 

@implementation OSTabBarController 

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    for(UIViewController *targetController in self.viewControllers){ 
     if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){ 
      [targetController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
     } 
    } 
} 

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{ 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
    for(UIViewController *targetController in self.viewControllers){ 
     if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){ 
      [targetController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
     } 
    } 
} 

@end 

DetailViewController

@implementation OSDetailViewController 

-(void)viewWillAppear:(BOOL)animated{ 
    //the splitViewController:willHideViewController:withBarButtonItem:forPopoverController: may not have been called 
    if(!UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){ 
     self.navigationItem.leftBarButtonItem = nil; 
    } 
} 

#pragma mark - UISplitViewControllerDelegate Methods 

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 
{ 
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 

} 

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    [self.navigationItem setLeftBarButtonItem:nil animated:YES]; 
} 

@end 
+0

Je n'ai pas testé à fond, mais cette approche a du sens et jusqu'à présent semble avoir résolu le problème. – Chiubaka

+0

Super! Cela a bien fonctionné pour moi dans de nombreuses applications de production. –

Questions connexes