【问题标题】:UISplitViewController in UITabBarController in iOS 5iOS 5 中的 UITabBarController 中的 UISplitViewController
【发布时间】:2011-12-23 16:54:59
【问题描述】:

我在每个项目上都有一个带有 splitviewcontroller 的标签栏。我使用了该站点 https://github.com/grgcombs/IntelligentSplitViewController 的子类,并且在 iOS 4 中一切正常,但在 iOS 5 中我遇到了问题。当我以纵向模式启动应用程序,然后更改为横向并转到选项卡栏中的第二项,然后再次更改为纵向模式并单击弹出框,然后关闭弹出框,转到选项卡中的第一项,再次打开弹出框并更改为景观,主视图消失,弹出框仍然可见。有人知道如何解决吗?

【问题讨论】:

    标签: ipad uitabbarcontroller ios5 uisplitviewcontroller


    【解决方案1】:

    我一直在努力解决同样的问题。我没有使用您指示的 UISplitViewController 子类,而是创建了一个 UITabBarController 子类,它将旋转消息正确地传播到它包含的所有 UISplitViewControllers。这维护了 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
    

    【讨论】:

    • 我还没有彻底测试过这个,但是这种方法是有意义的,到目前为止似乎已经解决了这个问题。
    猜你喜欢
    • 2011-01-29
    • 2015-06-06
    • 1970-01-01
    • 2016-02-13
    • 2020-04-20
    • 2020-11-27
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多