2016-09-05 6 views
3

Ich habe ein TabBarController programmatisch erstellt wie unterErkennen tippen auf eine Registerkarte in UITabBarController

let tabbarController = UITabBarController() 
    let homeViewController = HomeViewController() 
    let rewardsViewController = RewardsViewController() 
    let moreViewController = NewMoreViewController() 

    let homeNVc = UINavigationController() 
    homeNVc.viewControllers = [homeViewController] 

    let rewardsNVc = UINavigationController() 
    rewardsNVc.viewControllers = [rewardsViewController] 

    let moreNVc = UINavigationController() 
    moreNVc.viewControllers = [moreViewController] 

    tabbarController.viewControllers = [homeNVc, rewardsNVc, moreNVc] 

    tabbarController.tabBar.items![0].title = NSLocalizedString("Dashboard", comment: "") 
    tabbarController.tabBar.items![1].title = NSLocalizedString("Prämien", comment: "") 
    tabbarController.tabBar.items![2].title = NSLocalizedString("Mehr", comment: "") 
    self.window?.rootViewController = tabbarController 
} 

alles funktioniert. Ich kann per Tabs perfectrly bewegen, jetzt habe ich tableView in meinem homeViewController. Was ich neu laden möchte, wenn der Benutzer auf die erste Registerkarte meines TabBarControllers tippt. Selbst wenn der Benutzer bereits auf diesem ViewController ist, möchte ich TableView neu laden.

Also im Grunde Wie kann ich erkennen, dass der Benutzer auf den ersten ViewController angetippt?

bitte leite mich dank :-)

Antwort

5

In Ihrem homeViewController Sie benötigen diese Delegatmethode implementieren:

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { 

    //ask where it is first tab bar item 
    if self.tabBarController?.selectedIndex == 0 { 
     // your action, e.g.: 
     self.tableView.reloadData() 
    } 

} 

ANMERKUNG:

Sie brauchen, um Ihre Klasse wie folgt erhalten:

a)

class YourTabBarController: UITabBarController { // inherit from UITabBarController 

oder dies:

b)

class YourViewController: UIViewController, UITabBarDelegate { // set protocol 
+0

Ich habe diesen Code für Swift 3, so dass für den Fall, dass Sie kopieren einige Anweisungen müssen – pedrouan

+0

self.tabBarController? .selectedIndex war der Schlüsselpunkt für mich didSelectItem war nicht so aufgerufen, so dass ich didSelectViewController verwendet. Ist das in Ordnung ? – Byte

+0

Ja, definitiv. – pedrouan

3

Invoke UITabBarControllerDelegate und implementieren diese Methode

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController){ 

} 
+1

Wie werde ich erkennen, welche Registerkarte angetippt wurde? – Byte

+0

Jede Registerkarte ist mit einem Viewcontroller verbunden. In Ihrer Frage schreiben Sie "So im Grunde Wie kann ich erkennen, dass der Benutzer auf den ersten ViewController geklopft hat?" In dieser Methode erhalten Sie ViewController. Sie können überprüfen, ViewController oder seine Kennung, Titel etc. – Sofeda

1

einfach implementieren die folgenden Delegate-Methode,

func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { 

     if item.title == "first tab name"{ 
      //Do your thing 
    } 
+0

Ich habe diese Methode implementiert, aber es wird nicht aufgerufen. Aber didSelectViewController wird – Byte

+0

aufgerufen Es ist nicht sicher, es gegen Titel zu testen. Es ist nicht die richtige Konvention. – pedrouan

1

Ich habe kürzlich etwas ähnliches geschrieben. Aus Gründen der Konsistenz habe ich für jeden von mir verwendeten Tab eine Basisklasse BaseTabBarViewController erstellt. Berücksichtigen Sie jedoch, dass, wenn eine Registerkarte ein Navigationscontroller war, derjenige, der von BaseTabBarViewController erbt, der Stammansicht-Controller ist. Diese Basisklasse implementiert das UITabBarControllerDelegate-Protokoll. In viewDidLoad kennzeichnen wir es als Delegat. Im Delegatmethode (Objective-C, ganz ähnlich in schnellen 3):

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 


if (tabBarController.selected == 0) 
{ 
    // do what you need 
0

Zugang zu erhalten, auf die tabBarItem für UITabBarController

Swift überschreibt die folgende Funktion in Ihrer benutzerdefinierten Klasse abgehört wurde:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { 
    guard let index = tabBar.items?.index(of: item) else { return } 

    // Do something with the index 
} 
Verwandte Themen