UISplitViewController в UITabBarController в iOS 5 - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть вкладка с splitviewcontroller для каждого элемента.Я использовал подкласс с этого сайта https://github.com/grgcombs/IntelligentSplitViewController, и в iOS 4 все работало нормально, но в iOS 5 у меня проблема.Когда я запускаю приложение в портретном режиме, затем переключаюсь в альбомную ориентацию и перехожу ко второму элементу на панели вкладок, затем снова переключаюсь в портретный режим и нажимаю на всплывающее окно, затем отклоняю поповер, переходим к первому элементу на панели вкладок, снова открываем поповер иПри смене ландшафта основной вид исчезает, а поповер все еще виден.Кто-нибудь знает, как это исправить?

1 Ответ

1 голос
/ 28 марта 2013

Я работал над решением той же проблемы. Вместо того, чтобы использовать указанный вами подкласс UISplitViewController, я создал подкласс UITabBarController, который должным образом распространяет сообщения вращения на все содержащиеся в нем UISplitViewController. Это поддерживает правильное внутреннее состояние UISplitViewControllers. Однако один из методов делегата SplitViewController не вызывается, если SplitViewController не отображается, поэтому я обрабатываю это в контроллере подробного представления. Я подтвердил, что это работает в 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
...