2016-09-05 44 views
3

一個標籤檢測自來水我創建了一個tabBarController編程像下面中的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 
} 

一切工作。我可以通過標籤perfectrly,現在我有taViewView在我的homeViewController。當用戶點擊我的TabBarController的第一個選項卡時,我想重新加載它。即使用戶已經在該viewController我想重新加載tableView。

所以基本上我怎麼能檢測到用戶點擊第一個ViewController?

請指引我感謝:-)

回答

5

在你homeViewController你可能需要實現這個委託方法:

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() 
    } 

} 

備註

你需要保持你的類是這樣的:

一)

class YourTabBarController: UITabBarController { // inherit from UITabBarController 

或本:

B)

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

我爲Swift 3做了這個代碼,所以如果您複製粘貼,您可能需要更正一些語句 – pedrouan

+0

self.tabBarController?.selectedIndex是我的關鍵點didSelectItem不是得到調用,所以我用didSelectViewController。可以嗎 ? – Byte

+0

是的,絕對。 – pedrouan

3

調用UITabBarControllerDelegate和實施此方法

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

} 
+1

我該如何檢測哪個標籤被點擊? – Byte

+0

每個選項卡都附帶一個視圖控制器。在你的問題中,你寫了「所以基本上我怎麼能檢測到第一個ViewController的用戶點擊?」所以在這個方法中你會得到viewController。您可以檢查viewController或其標識符,標題等 – Sofeda

1

就實現以下委託方法,

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

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

我已經實現了這種方法,但它沒有被調用。但didSelectViewController被稱爲 – Byte

+0

對標題進行測試並不安全。這是不正確的慣例。 – pedrouan

1

我最近寫了類似的東西。爲了一致性,我爲每個使用的Tab創建了一個基類BaseTabBarViewController。但請注意,如果選項卡是導航控制器,則從BaseTabBarViewController繼承的是根視圖控制器。 此基類實現UITabBarControllerDelegate協議。在viewDidLoad中,我們將其標記爲委託。 在委託方法(Objective-C中,斯威夫特3十分相似):

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


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

要訪問該tabBarItem被竊聽覆蓋下面的函數在自定義類的UITabBarController

斯威夫特:

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

    // Do something with the index 
} 
相關問題