2009-06-23 6 views
6

gerade etwas herausgefunden: Wenn Sie eine Tabbar in Kombination mit einem NavigationController (das einige Ansichten auf seinem Stack hat) und doppelklicken Sie auf das TabBarItem, erscheint die Ansicht zum ersten ViewController, ob Du magst es oder nicht.iPhone UITabbar Element Doppelklick auf Popups Controller

Gibt es eine Möglichkeit, dies zu verhindern?

Antwort

0

Der einzige Weg, den ich bis jetzt gefunden habe, ist, eine Unterklasse von UINavigationController zu machen und die popToRootViewControllerAnimated-Methode zu überschreiben, um nil zurückzugeben.

Dies scheint die Methode zu sein, die die UITabBar beim zweimaligen Tabstopp aufruft. Ich weiß nicht, ob es der richtige Weg ist aber ... Würde ein Feedback zu diesem Thema Liebe ...

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated { 
    return nil; 
} 
1

Ich lief in dieses Problem selbst und fand einen Weg, es zu tun. Machen Sie einen Delegaten für Ihren UITabBarController und implementieren tabBarController:shouldSelectViewController: zu verhindern, dass die gleichen Controller Auswahl:

- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc { 
    return tbc.selectedViewController != vc; 
} 

Sie auch kompliziertere Logik hinzufügen können, wenn Sie es in einigen Fällen verhindern wollen.

5

Sie sollten dieses Verhalten wahrscheinlich nicht verhindern. Es ist eine Standardkonvention für iPhone-Benutzeroberflächen, wie das Tippen auf die Statusleiste, um zum Anfang einer Bildlaufansicht zu blättern. Wenn Sie es wirklich wollen, sollten Sie die UITabBarController Delegate-Methode -tabBarController:shouldSelectViewController: implementieren, wie mckeed erwähnt. Wenn Sie jedoch über mehr als fünf Registerkarten verfügen, ist der selectedViewController möglicherweise ein Ansichtscontroller, der sich im Abschnitt "Weitere Informationen" befindet, aber vc ist [UITabBarController moreNavigationController]. Hier ist eine Implementierung, die diesen Fall behandelt:

- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc { 
    UIViewController *selected = [tbc selectedViewController]; 
    if ([selected isEqual:vc]) { 
     return NO; 
    } 

    if ([vc isEqual:[tbc moreNavigationController]] && 
     [[tbc viewControllers] indexOfObject:selected] > 3) { 
     return NO; 
    } 

    return YES; 
} 
+1

Ich empfehle auch nicht, dieses Verhalten ohne sehr gute Gründe zu verhindern. Benutzer werden sauer, wenn eine systemweite Verknüpfung nicht verfügbar ist. –

0

ich mit dem Halten zustimmen Verhalten wie gemeinte, aber zugleich die Dinge interessant, mit Abwickeln der VC-Stack anmutig (wie bei der Bearbeitung eine verschachtelte Reihe von Core Data Objekte). In meinem Fall ist es gleichbedeutend mit jedem VC.

Also gibt es eine Möglichkeit für mich zu wissen, dass wir den ganzen Weg bis zum Root-VC knallen? Ich denke, eine Cancel/Rollback-Operation während ViewWillDisappear schneidet es nicht ab, weil dieselbe Ansicht nach einem Speichern ebenfalls verschwinden würde. Ich muss irgendwie senden "wir stornieren - bail out!" wenn Sie den ganzen Weg zum Root-VC in einem bestimmten Tab poppen. Auch das Überprüfen eines dirty/new-Flags als Sicherheitscheck in viewWillDisappear hilft nicht, da dieser Test dann im Falle eines legit cancel (dh wenn der Cancel-Button tatsächlich angetippt wird) zweimal aufgerufen würde.

+0

Ah-ha. Zuerst dachte ich, Kategorien wären dein Freund, und vielleicht könnte ich einen auf UIViewController einrichten und in popToRootViewControllerAnimated eingreifen: um die Truppen zu warnen. Aber das würde stattdessen Unterklassenbildung erfordern, nicht wahr? (Ich versuche, in Cocoa nach Möglichkeit keine Unterklassen zu bilden, aber das ist vielleicht nicht eine der Zeiten, in denen es möglich ist.) Wenn es einen weniger entropiegeladenen Weg gibt, bin ich ganz Ohr. –