web-dev-qa-db-fra.com

UISplitViewController dans une TabBar (UITabBarController)?

Je suis dans une sorte de situation que je dois commencer avec une application basée sur des onglets et que j'ai besoin d'une vue divisée pour un ou plusieurs onglets. Mais il semble que l'objet contrôleur de vue fractionnée ne puisse pas être ajouté au tabbarController. (Bien que l'objet de la barre de tabulation puisse être ajouté au splitviewcontroller).

Le problème peut être vu autrement: j'ai un plein écran dans la partie gauche J'ai une vue de table quand n'importe quelle ligne est sélectionnée dans la table un popover devrait sortir pointant cette ligne. Maintenant, lorsqu'une ligne du popover est sélectionnée, les lignes de ce popover se trouvent à gauche sous la ligne sélectionnée (seule cette ligne serait visible) et un autre popover sort de la ligne sélectionnée. (Type de navigation fil d'Ariane)

Je pense que je suis clair dans ce que j'ai expliqué. Alors les gars, des idées ou des solutions?

Veuillez me faire savoir si je ne suis pas clair dans ma question.

Merci,

Madhup

28
Madhup Singh Yadav

J'ai fait un exemple d'application. et a constaté que nous pouvons le faire par programme comme:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

        NSMutableArray *array = [NSMutableArray array];

        NSMutableArray *tabArray = [NSMutableArray array]; 

        UISplitViewController *splitViewConntroller = [[UISplitViewController alloc] init];

        MainViewController *viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];




        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        array = [NSMutableArray array];

        splitViewConntroller = [[UISplitViewController alloc] init];

        viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        // Add the tab bar controller's current view as a subview of the window
        [tabBarController setViewControllers:tabArray];

        [window addSubview:tabBarController.view];
        [window makeKeyAndVisible];

        return YES;
    }

J'espère que cela t'aides.

7

À l'aide du générateur d'interface, créez un contrôleur de vue fractionnée et un contrôleur de barre d'onglets et reliez-les à vos prises:

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;

Dans votre délégué d'application didFinishLaunchingWithOption, affectez votre contrôleur de vue fractionnée au contrôleur de la barre d'onglets:

splitViewController.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Title" image:nil tag:0] autorelease];
NSArray *controllers = [NSArray arrayWithObjects:splitViewController,  /* other controllers go here */ nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];

Cela va créer un contrôleur de barre d'onglets (avec seulement 1 onglet dans ce cas), qui s'affiche correctement dans toutes les orientations.

19
g_fred

J'ai écrit une sous-classe pour UISplitViewController qui écoutera les changements d'orientation du périphérique et s'orientera en conséquence. Avec cette classe, je peux maintenant placer des vues fractionnées dans un UITabBarController et chaque vue fractionnée se comportera correctement lors de la rotation, même si ce n'est pas l'onglet le plus en avant. J'ai déployé cela avec succès dans TexLege et il a été approuvé pour une utilisation dans l'App Store, mais votre kilométrage peut varier. Veuillez consulter le référentiel sur Github.

N'hésitez pas à le modifier et à le modifier, et je suis toujours intéressé à entendre des commentaires (ou des plaintes) à ce sujet. https://github.com/grgcombs/IntelligentSplitViewController

9
Greg Combs

J'ai créé une sous-classe UITabBarController qui propage correctement les messages de rotation à tous les UISplitViewControllers qu'elle contient. Cela maintient l'état interne correct des UISplitViewControllers. Cependant, l'une des méthodes déléguées de SplitViewController n'est pas appelée si le SplitViewController n'est pas visible, donc je prends cela en compte dans la méthode viewWillAppear du contrôleur de vue détaillée. J'ai confirmé que 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
2
Brody Robertson

Voir mon article sur l'adaptation des contrôleurs de vue fractionnée à une interface de barre d'onglets existante: http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html

2
user318668

Pour laisser un tabbarcontroller apparaître comme une vue principale pour splitviewcontroller, vous devez réécrire tabbarcontroller afin qu'il prenne en charge ou des orientations (par exemple, en utilisant une catégorie pour la classe UITabBarController)

2
Yan Cheng

Gardez à l'esprit que OS 3.2 ne ne fournit pas un support approprié pour une vue partagée en tant que vue de barre d'onglets.

Vous pouvez le faire "fonctionner" mais il y aura des bugs - le plus important est qu'un changement d'orientation effectué sur la vue d'un autre onglet ne se propagera pas correctement à la vue de l'onglet splitview, ce qui rendra la vue délirante lorsque vous y retournerez (côté gauche ou l’élément du bouton de barre est manquant, etc.).

Je suis arrivé à la conclusion que je dois créer mon propre splitview pour l'utiliser dans un tabBarController à cause de ce problème.

J'avais entendu des rumeurs selon lesquelles Apple travaillait sur un correctif mais cela fait des mois maintenant et aucune mise à jour de l'iPad OS n'a eu lieu - peut-être que l'OS 4 pour l'iPad le résoudra.

1
Jason

Vous pouvez utiliser IB pour créer tabtab et modifier les onglets pour splitviewcontroller.

-(void) makeSplitViewController {
NSMutableArray *controllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];
int index = 0;

for (UIViewController *controller in tabBarController.viewControllers) {
    if ([controller.tabBarItem.title isEqualToString:@"Stock"]) {
        stockDetailController = [[StockDetailController alloc] initWithNibName:@"StockDetailController" bundle:nil];

        stockMasterController = [[StockMasterController alloc] initWithStyle:UITableViewStylePlain]; 
        stockMasterController.navigationItem.title = date;
        stockMasterController.stockDetailController = stockDetailController;

        UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:stockMasterController] autorelease];

        splitViewController = [[UISplitViewController alloc] init];
        splitViewController.tabBarItem = controller.tabBarItem;
        splitViewController.viewControllers = [NSArray arrayWithObjects:nav, stockDetailController, nil];
        splitViewController.delegate = stockDetailController;

        [controllers replaceObjectAtIndex:index withObject:splitViewController];
    }

    index++;
}

tabBarController.viewControllers = controllers;

}

0
mikezang

Nous avons réussi à avoir un UISplitViewController dans un UITabViewController sur iPad avec iOS5 +.

pour faire une histoire courte: ça marche:

  • hors de la boîte si vous acceptez une séparation également en mode portrait;
  • avec un peu de travail, si vous voulez que la vue principale soit masquée dans le portrait et qu'elle n'apparaisse qu'en appuyant sur un bouton.

L'astuce dans le deuxième cas est d'utiliser IntelligentSplitViewController (voir quelques articles, merci Greg Combs) ou d'étendre de manière similaire un UISplitVC, et veillez à ce que le délégué de la sous-classe du contrôleur splitview soit toujours un objet vivant.

Nous avons détaillé le processus sur:

https://devforums.Apple.com/message/763572#763572

0
zontar