Nehmen wir an, ich habe eine UIButton
in einer Registerkarte in meiner iPhone-App, und ich möchte, dass in der Registerkartenleiste der TabBarController
eine andere Registerkarte geöffnet wird. Wie würde ich den Code dafür schreiben?
Ich gehe davon aus, dass ich die vorhandene Ansicht entlade und eine bestimmte Registerkartenansicht lade, aber ich bin nicht sicher, wie ich den Code genau schreiben soll.
Versuchen Sie diesen Code in Swift oder Objective-C
Swift
self.tabBarController.selectedIndex = 1
Ziel c
[self.tabBarController setSelectedIndex:1];
Beachten Sie, dass die Registerkarten ab 0 indiziert werden. Der folgende Codeausschnitt funktioniert also
tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];
geht zum fünften Tab in der Bar.
Meiner Meinung nach ist selectedIndex
oder die Verwendung von objectAtIndex
nicht unbedingt der beste Weg, um die Registerkarte zu wechseln. Wenn Sie Ihre Tabs neu anordnen, kann eine hartcodierte Indexauswahl das Verhalten Ihrer früheren App beeinträchtigen.
Wenn Sie die Objektreferenz des View-Controllers haben, zu dem Sie wechseln möchten, können Sie Folgendes tun:
tabBarController.selectedViewController = myViewController
Natürlich müssen Sie sicherstellen, dass sich myViewController
wirklich in der Liste von tabBarController.viewControllers
befindet.
Sie können einfach die selectedIndex
-Eigenschaft des UITabBarController auf den entsprechenden Index setzen. Die Ansicht wird genauso geändert, wie der Benutzer auf die Tab-Schaltfläche tippt.
Ich habe versucht, was Disco S2 vorschlug, es war knapp, aber das war es, was am Ende für mich gearbeitet hat. Dies wurde nach Abschluss einer Aktion in einem anderen Tab aufgerufen.
for (UINavigationController *controller in self.tabBarController.viewControllers)
{
if ([controller isKindOfClass:[MyViewController class]])
{
[self.tabBarController setSelectedViewController:controller];
break;
}
}
In Fällen, in denen Sie die Registerkarten verschieben können, finden Sie hier einen Code.
for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
[self.tabBarController setSelectedViewController:controller];
break;
}
}
Ich wollte in der Lage sein, anzugeben, welche Registerkarte nach Klasse und nicht nach Index angezeigt wird, da ich dachte, dass dies eine robuste Lösung ist, die weniger davon abhängt, wie Sie IB verbinden. Ich habe weder Disco's noch Jopeds Lösungen gefunden, so dass ich diese Methode entwickelte:
-(void)setTab:(Class)class{
int i = 0;
for (UINavigationController *controller in self.tabBarContontroller.viewControllers){
if ([controller isKindOfClass:class]){
break;
}
i++;
}
self.tabBarContontroller.selectedIndex = i;
}
sie nennen es so:
[self setTab:[YourClass class]];
Hoffe, das ist für jemanden hilfreich
import UIKit
class TabbarViewController: UITabBarController,UITabBarControllerDelegate {
//MARK:- View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//Tabbar delegate method
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
yourView.popToRootViewController(animated:false)
}
}
Verwendung in AppDelegate.m
-Datei:
(void)tabBarController:(UITabBarController *)tabBarController
didSelectViewController:(UIViewController *)viewController
{
NSLog(@"Selected index: %d", tabBarController.selectedIndex);
if (viewController == tabBarController.moreNavigationController)
{
tabBarController.moreNavigationController.delegate = self;
}
NSUInteger selectedIndex = tabBarController.selectedIndex;
switch (selectedIndex) {
case 0:
NSLog(@"click me %u",self.tabBarController.selectedIndex);
break;
case 1:
NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
break;
default:
break;
}
}
Wie die Lösung von Stuart Clark, aber für Swift 3:
func setTab<T>(_ myClass: T.Type) {
var i: Int = 0
if let controllers = self.tabBarController?.viewControllers {
for controller in controllers {
if let nav = controller as? UINavigationController, nav.topViewController is T {
break
}
i = i+1
}
}
self.tabBarController?.selectedIndex = i
}
Verwenden Sie es so:
setTab(MyViewController.self)
Bitte beachten Sie, dass mein tabController auf viewControllers hinter den navigationControllers verweist. Ohne navigationController würde es so aussehen:
if let controller is T {
Wie die Lösung von Stuart Clark, aber für Swift 3 und zur Verwendung der Wiederherstellungskennung, um die richtige Registerkarte zu finden:
private func setTabById(id: String) {
var i: Int = 0
if let controllers = self.tabBarController?.viewControllers {
for controller in controllers {
if let nav = controller as? UINavigationController, nav.topViewController?.restorationIdentifier == id {
break
}
i = i+1
}
}
self.tabBarController?.selectedIndex = i
}
Verwenden Sie es wie folgt ("Humans" und "Robots" müssen auch im Storyboard für bestimmte viewController und ihre Wiederherstellungs-ID festgelegt sein, oder verwenden Sie die Storyboard-ID und überprüfen Sie als Wiederherstellungs-ID "Storyboard-ID verwenden"):
struct Tabs {
static let Humans = "Humans"
static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)
Bitte beachten Sie, dass mein tabController auf viewControllers hinter den navigationControllers verweist. Ohne navigationController würde es so aussehen:
if controller.restorationIdentifier == id {
Mein Problem ist etwas anders, ich muss von einem childViewController in der 1. TabBar auf den Home ViewController der 2. TabBar wechseln. Ich verwende einfach die Lösung, die im Obergeschoss bereitgestellt wurde:
tabBarController.selectedIndex = 2
Wenn Sie jedoch zur Startseite von 2nd tabBar wechseln, ist der Inhalt nicht sichtbar. Wenn ich debugge, viewDidAppear, viewWillAppear, viewDidLoad, dann heißt keiner von ihnen .. Meine Lösungen bestehen darin, den folgenden Code im UITabBarController hinzuzufügen:
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}