UISplitViewController in einem TabBar (UITabBarController)?
Frage
Ich bin in einer solchen Situation, dass ich mit einem Tab-basierte Anwendung starten müssen und dass ich brauche eine geteilte Ansicht für eine oder mehrere Registerkarten. Aber es scheint, dass Controller-Objekt geteilte Ansicht kann nicht in die TabBarController hinzugefügt werden. (Obwohl Tabbar Objekt kann zum splitviewcontroller hinzugefügt werden).
Das Problem kann gesehen otherways werden: Ich habe ein Vollbild im linken Teil I eine Tabellenansicht, wenn jede Zeile in der Tabelle ausgewählt wird, ein popover kommen sollte diese Zeile zeigt. Nun, wenn jede Reihe in der popover die Zeilen in diesem popover ausgewählt kommt auf der linken Seite unter der ausgewählten Zeile (nur diese Zeile wäre sichtbar) und ein anderer popover kommt aus der ausgewählten Zeile aus. (Brotkrumen-Navigation-Typ)
Ich glaube, ich bin klar, was ich erklärt. Also Jungs irgendwelche Ideen oder Workarounds?
Bitte lassen Sie mich wissen, wenn ich nicht in meiner Frage bin löschen.
Danke,
Madhup
Lösung 3
habe ich eine Beispielanwendung. und fanden wir es tun können programmatisch wie:
- (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, das hilft.
Andere Tipps
den Interface Builder Erstellen Sie mit Hilfe eines geteilten View-Controller und eine Tab-Leiste Controller und verknüpfen sie mit Ihren Filialen:
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
In AppDelegate didFinishLaunchingWithOption
, ordnen Sie Ihren Split-View-Controller auf die Tab-Leiste Controller:
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];
Dies wird eine Tab-Leiste Controller erstellen (mit nur 1 Tab in diesem Fall), die in allen Orientierungen korrekt angezeigt wird.
Ich habe für die UISplitViewController auf eine Unterklasse geschrieben, die für Änderungen an der Geräteorientierung hören und orientieren sich entsprechend. Mit dieser Klasse kann ich nun geteilte Ansichten innerhalb eines UITabBarController platzieren und jede geteilte Ansicht verhält sich korrekt bei einer Drehung, auch wenn es nicht der vorderste Registerkarte ist. Ich habe dies erfolgreich im Einsatz in TexLege und es wurde für den Einsatz in dem App Store zugelassen, aber die Leistung kann variieren. Bitte beachten Sie das Repository auf Github.
Fühlen Sie sich frei, es zu gabeln und zu ändern, und ich bin zu hören, Kommentare immer interessiert (oder Beschwerden) darüber. https://github.com/grgcombs/IntelligentSplitViewController
Um ein TabBarController zu lassen als Master-Ansicht für splitviewcontroller erscheinen Sie umschreiben sollte TabBarController, so dass sie unterstützen oder Orientierungen (so sagen, eine Kategorie für die Klasse UITabBarController verwenden)
Beachten Sie, dass OS 3.2 hat nicht bieten angemessene Unterstützung für eine SPLITVIEW- als Tabbar Ansicht.
Sie können es machen „Arbeit“, aber es wird Fehler haben - die größte ist, dass eine Orientierungsänderung auf eine andere Registerkarte Ansicht vorgenommen werden oft nicht auf die SPLITVIEW- Tabansicht propagieren richtig, die Ansicht gehen verrückt zu machen, wenn Sie es zurück (linke Seitenansicht ist der Bildschirm über oder barbutton Artikel fehlt, etc.).
Ich habe zu dem Schluss gekommen, dass ich meine eigenen SPLITVIEW- zur Verwendung in einem TabBarController erstellen wegen dieses Problems.
Ich hatte Gerüchte gehört, dass Apple wurde an einer Lösung arbeiten, aber es ist Monate her, jetzt und kein iPad OS-Updates aufgetreten ist -. Vielleicht OS 4 für das iPad wird es richten
Sie können IB verwenden, um Build tabtab und ändern Tabs 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;
}
ist uns gelungen, einen UISplitViewController in einem UITabViewController auf dem iPad mit iOS5 + zu haben.
Um eine lange Geschichte kurz zu machen: es funktioniert:
- aus der Box, wenn Sie eine Spaltung auch im Portrait akzeptieren;
- mit einem bisschen Arbeit, wenn Sie die Master-Ansicht im Hochformat versteckt haben, und haben es erscheinen nur auf eine Taste tippen.
Der Trick im zweiten Fall ist die IntelligentSplitViewController (siehe ein paar Beiträge oben, thanx Greg Combs) zu verwenden oder in ähnlicher Weise eine UISplitVC zu verlängern, und darauf achtet, dass die Delegierten der Unterklasse des SPLITVIEW- Controller ist immer ein Live-Objekt.
Wir haben den Prozess detailliert auf: