webentwicklung-frage-antwort-db.com.de

Programmgesteuert auf eine TabBar-Registerkarte wechseln?

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.

143
rottendevice

Versuchen Sie diesen Code in Swift oder Objective-C

Swift

self.tabBarController.selectedIndex = 1

Ziel c  

[self.tabBarController setSelectedIndex:1];
367
Jordan

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.

20
John Smith

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.

9
ThomasT

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.

9
Alex Deem

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;
    }
}
3
Joped

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;
            }
        }
2
StuStirling

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

1
Stuart Clark
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)
}



}
0

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;

    }

}
0
Rakesh Singh

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 {
0
David

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 {
0
David

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
}
0
Jin