UITabBarController + UISplitviewController альтернативы? - PullRequest
0 голосов
/ 24 декабря 2010

Поскольку эта конфигурация не поддерживается, мне было интересно, какие альтернативы люди использовали.

У меня есть универсальное приложение, которое в настоящее время использует UITabBarController с 4 вкладками на iPhone и iPad.

КакТеперь я хотел бы использовать контроллер splitview, с которым столкнулся проектное решение.

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2013

Я создал подкласс UITabBarController, который должным образом распространяет сообщения вращения на все содержащиеся в нем UISplitViewController. Это поддерживает правильное внутреннее состояние UISplitViewControllers. Однако один из методов делегата SplitViewController не вызывается, если SplitViewController не отображается, поэтому я объясняю это в методе viewWillAppear контроллера подробного представления. Я подтвердил, что это работает в iOS5.0 - iOS6.1

AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        OSMasterViewController *masterViewController = [[[OSMasterViewController alloc] initWithNibName:@"OSMasterViewController_iPhone" bundle:nil] autorelease];
        self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
        self.window.rootViewController = self.navigationController;

    } else {

        OSMasterViewController *masterViewController = [[[OSMasterViewController alloc] initWithNibName:@"OSMasterViewController_iPad" bundle:nil] autorelease];
        UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];

        OSDetailViewController *detailViewController = [[[OSDetailViewController alloc] initWithNibName:@"OSDetailViewController_iPad" bundle:nil] autorelease];
        UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];

        masterViewController.detailViewController = detailViewController;

        UISplitViewController *splitViewController = [[[OSSplitViewController alloc] init] autorelease];
        splitViewController.viewControllers = @[masterNavigationController, detailNavigationController];
        splitViewController.delegate = detailViewController;

        OSTestViewController *secondaryController = [[[OSTestViewController alloc] init] autorelease];

        OSTabBarController *tabBarController = [[[OSTabBarController alloc] init] autorelease];
        tabBarController.viewControllers = @[self.splitViewController, secondaryController];

        self.window.rootViewController = tabBarController;
    }

    [self.window makeKeyAndVisible];
    return YES;
}

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 голосов
/ 24 декабря 2010

Вы можете реплицировать UITabBar внутри modelViewController, который появляется, когда нажимается кнопка в нижней части экрана, и меняются местами представления. :)

...