Frage

Ich versuche, eine Benutzeroberfläche wie in der strukturiert umzusetzen Tweetie App, die als so verhält: der Top-Level-View-Controller scheint ein Navigation-Controller, Ansicht, deren Wurzel zu sein, sind ein „Konten " Tabellenansicht. Wenn Sie auf einem Konto klicken, geht es in die zweite Ebene, die eine Tab-Leiste auf der Unterseite. Jede Registerkarte Artikel zeigt eine andere Liste und können Sie weitere Drill-down (die nachfolgenden Ebenen zeigen nicht die Tab-Leiste).

So scheint dies die Implementierung Hierarchie ist:

  • UINavigationController
    1. Konten : UITableViewController
    2. UITabBarController
      1. Tweets : UITableViewController
        • Detailansicht eines tweet / user / etc
      2. Antworten : UITableViewController
      3. ...

Dies scheint zu funktionieren [^ 1], scheint aber nach der SDK-Dokumentation für -pushViewController:animated: nicht unterstützt werden (Hervorhebung hinzugefügt):

  

Viewcontroller : Der View-Controller, der auf den Stapel geschoben wird. Es kann keine Instanz der Tab-Leiste Controller sein.

Ich mag private APIs und dergleichen vermeiden, aber ich bin nicht sicher, warum diese Nutzung ausdrücklich auch verboten, wenn es scheint gut zu funktionieren. Wer weiß den Grund?

Ich habe darüber nachgedacht, die Tab-Leiste Controller als Haupt-Controller setzen, mit den einzelnen Registerkarten separaten Navigationscontroller enthält. Das Problem dabei ist, dass jeder nav-Controller benötigt eine einzige Wurzel-View-Controller zu teilen (nämlich die „Konten“ Tabelle in Tweetie ) - dies scheint nicht zu funktionieren: die Tabelle Controller ein Schiebe zweiter nav-Controller scheint es, von den ersten zu entfernen. Ganz zu schweigen von all der Buchhaltung, wenn ein anderes Konto der Auswahl wäre wahrscheinlich ein Schmerz sein.

Wie soll ich dies den richtigen Weg implementieren?

[^ 1]: Die Tab-Leiste Controller muss subclassed werden, so dass die Tab-Leiste Controller Navigationspunkt auf diesem Niveau bleibt synchron mit dem Navigationspunkt des ausgewählten Registerkarte und die Tabelle Controllers Bedarf des einzelnen Registerkarten ihre jeweiligen Detailansichten schieben statt self.tabBarController.navigationController self.navigationController.

War es hilfreich?

Lösung

Die beiden bisherigen Antworten haben es richtig - ich verwende UITabBarController nicht in Tweetie. Es ist ziemlich einfach, eine benutzerdefinierte XXTabBarController (plain Unterklasse von UIViewController) zu schreiben, das glücklich ist, auf einen nav-Controller-Stack geschoben zu bekommen, aber immer noch lebt von der „View-Controller“ Philosophie. Jeder „Tab“ auf dem Konto spezifische Sicht (Tweets / Replies / Messages) ist ein eigenen View-Controller, und soweit sie davon betroffen sind, sie bekommen um auf dem Bildschirm durch einen plain-ol UITabBarController getauscht.

Andere Tipps

Ich baue eine App, die eine ähnliche Navigationsrahmen zu Tweetie verwendet. Ich habe einen Beitrag darüber geschrieben, wie auf meinem Blog, dies zu tun www .wiredbob.com die auch Links zum Quellcode. Es ist eine vollständige Vorlage, die Sie nehmen und als Grundlage für ein anderes Projekt verwenden. Viel Glück!

Es ist möglich, eine UITabBar eines UIViewController hinzuzufügen. So kann man nicht wirklich eine UITabBarController schieben und daher im Rahmen der Richtlinien des Apple-API bleiben.

In Interface Builder UITabBar ist unter "Windows, Views & Bars" in der Cocoa Touch-Bibliothek.

Ich tue dies in ein paar meiner apps. Der Trick, um eine Tab-Leiste auf eine Navigation basierte Anwendung auf das Hinzufügen ist nicht ein TabBarController zu verwenden. Fügen Sie eine Tab-Leiste zu der Ansicht, macht die View-Controller für diese Ansicht eines TabBarDelegate und reagieren auf Benutzerauswahl auf der Tab-Leiste in dem Code der View-Controller.

verwende ich Tab Bars zusätzliche Ansichten als Unter Blick auf die Tab-Leiste Ansicht hinzufügen möchten, eine Tabellenansicht mit verschiedenen Datensätzen neu zu laden, ein UIPickerView neu zu laden, etc.

Ich war für die vergangene Stunde kämpfen, um ein UITabBar zu implementieren, da es versteckt würde, wenn ich versuche, meine Ansicht anzuzeigen; dann fand ich diese Post :

Grundsätzlich sollten Sie sich Ihre neue Ansicht unter dem Tabbar einfügen, gemäß dieser Codezeile:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

In meiner app, der Root-View-Controller ist ein UINavigation Controller. An einem bestimmten Punkt in der App, ich brauche eine UITabBar angezeigt werden soll. Ich versuchte, einen UITabBar auf einem UIView innerhalb der Navigationshierarchie Implementierung, wie einige der früheren Beiträge vorgeschlagen, und dies funktioniert. Aber ich fand, dass ich mehr von dem Standardverhalten wollte, dass der Registerkarte Controller bietet und fand ich einen Weg, um die UITabBarController mit dem UINavigation Controller zu verwenden:

1) Wenn ich die UITabBarController Ansicht angezeigt werden soll, kann ich dies:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) Wenn ich zurückkehren will, wo ich in der Navigationshierarchie war, habe ich dies zu tun:

appDelegate.window.rootViewController = myNavControllerInstance;

Das ist, wie ich es tat. Dies treibt tatsächlich einen TabBarController auf Navigationssteuerung. Es funktioniert gut. Ich habe nicht überall in der Dokumentation, die Apple nicht auf diese Weise unterstützt. Kann mir jemand Link zu dieser Warnung?

Wenn diese Wahrheit ist, ist es möglich, dass Apple sich weigert, meine App zu veröffentlichen, um App Store?

-(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];
}

Dies könnte durch einfaches Einbetten des TabBarController in der Navigation Controller erreicht werden. Im Storyboard:

  1. Ziehen Sie ein Viewcontroller
  2. Klicken Sie auf die Viewcontroller Scene
  3. Klicken Sie auf Editor >> Einbetten in >> Navigation Controller.
  4. Ziehen Sie eine Schaltfläche auf dem gleichen Viewcontroller.
  5. Ziehen Sie ein TabBarController
  6. Schließen Sie den Knopf auf dem Viewcontroller zum TabBarController per Push Segue Aktion.

In diesem Fall wird nur der RootViewController des TabBarController würden in dem Stapel Navigation Controller sein. Alle Die TabBarItems müssten die Navigationsleiste am oberen und Benutzer können jederzeit auf Home-Bildschirm gehen, unabhängig von der gewählten TabBarItem

Dies könnte jederViewController in der Navigation Controller Stack erfolgen.

Wenn es funktioniert, bitte machen Sie mir, wie Sie den Ruf zu erhöhen, so dass ich die Bilder veröffentlichen können und den Code in der nächsten Antwort. :)

Ich schrieb eine Blog-Post, wie ich dieses Problem angegangen. Für mich eine modale Ansicht unter Verwendung war eine einfachere Lösung als eine benutzerdefinierte Registerkarte-Bar Implementierung zu schreiben.

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top