Ich versuche, eine Benutzeroberfläche zu implementieren, die wie in der Tweetie- App strukturiert ist und sich so verhält: Der Ansichts-Controller der obersten Ebene scheint ein Navigations-Controller zu sein, dessen Stammansicht eine Tabellenansicht "Konten" ist. Wenn Sie auf ein Konto klicken, wird die zweite Ebene mit einer Registerkartenleiste im unteren Bereich aufgerufen. Jedes Registerkartenelement zeigt eine andere Liste an und ermöglicht einen weiteren Drilldown (in den folgenden Ebenen wird die Registerkartenleiste nicht angezeigt).
Dies scheint also die Implementierungshierarchie zu sein:
UINavigationController
- Konten :
UITableViewController
UITabBarController
- Tweets :
UITableViewController
- Detailansicht eines Tweets / Benutzers / etc.
- Antworten :
UITableViewController
- ...
- Tweets :
- Konten :
Dies scheint zu funktionieren [^ 1], scheint jedoch gemäß der SDK-Dokumentation für -pushViewController:animated:
(Hervorhebung hinzugefügt) nicht unterstützt zu werden:
viewController : Der View Controller, der auf den Stapel verschoben wird. Es kann keine Instanz von Tab Bar Controller sein.
Ich möchte private APIs und ähnliches vermeiden, bin mir aber nicht sicher, warum diese Verwendung ausdrücklich verboten ist, auch wenn sie anscheinend gut funktioniert. Kennt jemand den Grund?
Ich habe darüber nachgedacht, den Tab-Bar-Controller als Haupt-Controller zu verwenden, wobei jeder der Tabs separate Navigations-Controller enthält. Das Problem dabei ist, dass jeder Navigationscontroller einen einzelnen Root-Ansichtscontroller gemeinsam nutzen muss (nämlich die Tabelle "Accounts" in Tweetie ) - dies scheint nicht zu funktionieren: Wenn Sie den Tabellencontroller auf einen zweiten Navigationscontroller verschieben, wird dieser anscheinend entfernt vom ersten. Ganz zu schweigen von der Buchhaltung bei der Auswahl eines anderen Kontos wäre wahrscheinlich ein Schmerz.
Wie soll ich das richtig umsetzen?
[^ 1]: Der Tab-Bar-Controller muss in Unterklassen unterteilt werden, damit das Navigationselement des Tab-Bar-Controllers auf dieser Ebene mit dem Navigationselement des ausgewählten Tabs synchron bleibt und der Tabellen-Controller des einzelnen Tabs seine jeweiligen Detailansichten self.tabBarController.navigationController
anstelle von verschieben muss self.navigationController
.
quelle
Ich erstelle eine App, die ein ähnliches Navigationsframework wie Tweetie verwendet. Ich habe in meinem Blog www.wiredbob.com einen Beitrag darüber geschrieben, der auch auf den Quellcode verweist . Es ist eine vollständige Vorlage, die Sie als Grundlage für ein anderes Projekt verwenden können. Viel Glück!
quelle
Es ist möglich, jedem UIViewController eine UITabBar hinzuzufügen. Auf diese Weise müssen Sie keinen UITabBarController pushen und bleiben daher innerhalb der Richtlinien der Apple API.
Im Interface Builder befindet sich UITabBar in der Cocoa Touch Library unter "Windows, Views & Bars".
quelle
Ich mache das in einigen meiner Apps. Der Trick beim Hinzufügen einer Registerkartenleiste zu einer auf NavigationController basierenden App besteht darin, KEINEN TabBarController zu verwenden. Fügen Sie der Ansicht eine Registerkartenleiste hinzu, machen Sie den Ansichts-Controller für diese Ansicht zu einem TabBarDelegate und reagieren Sie auf Benutzerauswahlen in der Registerkartenleiste im Code des Ansichts-Controllers.
Ich verwende Registerkartenleisten, um der Ansicht der Registerkartenleiste zusätzliche Ansichten als Unteransichten hinzuzufügen, eine Tabellenansicht mit verschiedenen Datensätzen neu zu laden, eine UIPickerView neu zu laden usw.
quelle
Ich hatte in der letzten Stunde Probleme, ein zu implementieren,
UITabBar
da es ausgeblendet werden würde, wenn ich versuchte, meine Ansicht anzuzeigen. dann habe ich diesen Beitrag gefunden :Stellen Sie grundsätzlich sicher, dass Sie Ihre neue Ansicht unter der Registerkartenleiste gemäß dieser Codezeile einfügen:
[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
quelle
In meiner App ist der Root View Controller ein UINavigation Controller. An einem bestimmten Punkt in der App muss ich eine UITabBar anzeigen. Ich habe versucht, eine UITabBar in einer UIView innerhalb der Navigationshierarchie zu implementieren, wie in einigen der vorherigen Beiträge vorgeschlagen, und dies funktioniert. Ich stellte jedoch fest, dass ich mehr vom Standardverhalten des Registerkarten-Controllers wollte, und fand eine Möglichkeit, den UITabBarController mit dem UINavigation-Controller zu verwenden:
1) Wenn ich die Ansicht des UITabBarControllers anzeigen möchte, gehe ich folgendermaßen vor:
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.window.rootViewController = myUiTabBarControllerInstance;
2) Wenn ich zu meiner Position in der Navigationshierarchie zurückkehren möchte, gehe ich folgendermaßen vor:
appDelegate.window.rootViewController = myNavControllerInstance;
quelle
Dies könnte durch einfaches Einbetten des TabBarControllers in den Navigationscontroller erreicht werden. Im Storyboard:
In diesem Fall befindet sich nur der RootViewController des TabBarControllers im Stapel des Navigationscontrollers. Alle TabBarItems haben die Navigationsleiste oben und der Benutzer kann jederzeit zum Startbildschirm wechseln, unabhängig vom ausgewählten TabBarItem
Dies kann an jedem ViewController im Stack des Navigationscontrollers erfolgen.
Wenn es funktioniert, schlagen Sie mir bitte vor, wie ich den Ruf verbessern kann, damit ich die Bilder und den Code in der nächsten Antwort veröffentlichen kann. :) :)
quelle
So habe ich es gemacht. Dies schiebt tatsächlich einen Tabbarcontroller auf den Navigationscontroller. Es funktioniert gut. Ich habe in der Dokumentation nirgends festgestellt, dass Apple diesen Weg nicht unterstützt. Kann mir jemand einen Link zu dieser Warnung geben?
Wenn dies der Fall ist, weigert sich Apple möglicherweise, meine App im Appstore zu veröffentlichen?
-(void)setArrayAndPushNextController { MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init]; MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init]; myFirstViewController.array = self.array; NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil]; UITabBarController *tab = [[UITabBarController alloc] init]; tab.viewControllers = array; [array release]; UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1]; UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2]; myFirstViewController.tabBarItem = item1; mySecondViewController.tabBarItem = item2; [self stopAnimatingSpinner]; [self.navigationController pushViewController:tab animated:YES]; [tab release]; [item1 release]; [item2 release]; }
quelle
Ich habe einen Blog-Beitrag darüber geschrieben, wie ich dieses Problem angegangen bin. Für mich war die Verwendung einer modalen Ansicht eine einfachere Lösung als das Schreiben einer benutzerdefinierten Tab-Bar-Implementierung.
http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/
quelle