UISplitViewController dans un TabBar (UITabBarController)?
Question
Je suis en genre de situation que je dois commencer par une application basée sur l'onglet et que je besoin d'un point de vue partagé pour un ou plusieurs onglets. Mais il semble que l'objet contrôleur de vue partagé ne peut être ajouté à la tabbarController. (Bien que l'objet peut être ajouté TabBar au splitviewcontroller).
Le problème peut être vu otherways: J'ai un plein écran dans la partie gauche, j'ai une vue de tableau quand une ligne est sélectionnée dans la table un popover devrait sortir pointant cette ligne. Maintenant, quand une ligne dans la popover est sélectionnée, les lignes de cette popover vient à la gauche sous la ligne sélectionnée (uniquement cette ligne serait visible) et un autre popover sort de la ligne sélectionnée. (Type de navigation miettes de pain)
Je pense que je suis clair dans ce que je l'ai expliqué. Alors les gars des idées ou des contournements de travail?
S'il vous plaît laissez-moi savoir si je ne suis pas clair dans ma question.
Merci,
Madhup
La solution 3
J'ai fait un exemple d'application. et nous avons constaté que nous pouvons le faire comme programme:
- (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;
}
Hope this helps.
Autres conseils
Utilisation du constructeur d'interface, créer un contrôleur de vue partagé et un contrôleur de barre d'onglets et de les relier à vos points de vente:
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
Dans votre délégué application didFinishLaunchingWithOption
, attribuez votre contrôleur de vue partagé sur le contrôleur de 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 est affiché correctement dans toutes les orientations.
J'ai écrit une sous-classe pour le UISplitViewController qui écoutera les changements à l'orientation de l'appareil et se orienter en conséquence. Avec cette classe, je peux maintenant placer des vues dans un fractionnés UITabBarController et chaque vue fourchues se comporter correctement lors de la rotation, même si ce n'est pas l'onglet en avant. Je l'ai déployé avec succès dans cette TexLege et il a été approuvé pour une utilisation dans l'App Store, mais votre kilométrage peut varier. S'il vous plaît voir le dépôt sur GitHub.
Ne hésitez pas à la fourchette et le modifier, et je suis toujours intéressé par les commentaires (ou entendre) plaintes à ce sujet. https://github.com/grgcombs/IntelligentSplitViewController
Pour laisser un tabbarcontroller apparaître comme une vue maître pour splitviewcontroller vous devez réécrire tabbarcontroller afin qu'il soutiendra ou orientations (dire, en utilisant une catégorie pour la UITabBarController de classe)
Gardez à l'esprit que OS 3.2 ne pas offrir un soutien adéquat pour une SPLITVIEW en vue TabBar.
Vous pouvez le faire « travailler », mais il aura des bugs - le plus important est qu'un changement d'orientation fait sur le point de vue d'un autre onglet souvent ne se propage pas à la vue de l'onglet SPLITVIEW correctement, ce qui rend la vue aller loufoque quand vous allez revenir (vue latérale gauche reprend l'écran ou l'élément barbutton manque, etc.).
Je suis arrivé à la conclusion que je dois créer mon propre SPLITVIEW à utiliser dans un tabBarController à cause de cette question.
J'avais entendu des rumeurs que Apple travaillait sur un correctif, mais il a été mois et aucune mise à jour iPad OS se sont produits -. Peut-être OS 4 pour l'iPad remédier
Vous pouvez utiliser IB pour construire et modifier Tabtab 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;
}
Nous avons réussi à avoir une UISplitViewController dans un UITabViewController sur iPad avec iOS5 +.
pour faire une histoire courte: cela fonctionne:
- de la case si vous acceptez une scission aussi en mode portrait;
- avec un peu de travailler, si vous voulez avoir la vue maître caché en mode portrait, et il apparaît que ont sur appuyer sur un bouton.
L'astuce dans le second cas est d'utiliser le IntelligentSplitViewController (voir quelques postes haut, Thanx Greg Combs) ou étendre de même un UISplitVC, et veiller à ce que le délégué de la sous-classe du contrôleur SPLITVIEW est toujours un objet direct.
Nous avons détaillé le processus sur: