2015-11-20 12 views
18

私はストーリーボード上のビューコントローラのカスタムクラスとして設定されていないルートビューコントローラを持っています。代わりに、私のすべてのビューコントローラはこのようにこのクラスをサブクラス化しています。タブバーアイテムが押されたときの検出

// RootViewController 
class RootViewController: UIViewController, UITabBarDelegate { 

    // This is not getting executed on any of the view controllers 
    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { 
     print("ddd") 
    } 
} 

// Subclassing it 
class TopStoriesViewController: RootViewController { 

} 

しかし、私は何かtabbaritemがrootviewcontrollerをサブクラス化されたビューコントローラ、すなわち上で押されたときに、メッセージが印刷されていないがやって苦労しているようです。

答えて

38

あなたのビューコントローラの基本クラスをUITabBarDelegateにしたくありません。これを行う場合、すべてのView Controllerサブクラスはタブバーの代理人になります。 、

class MyTabBarController: UITabBarController, UITabBarControllerDelegate { 

そのクラスでは、のviewDidLoadをオーバーライドして、そこに自己にデリゲートプロパティを設定します:私はあなたがやりたいと思うことは、このような何か、UITabBarControllerを拡張することです

self.delegate = self 

注:これは、タブバーコントローラの委任を設定しています。タブバーには、タブバーコントローラが管理する独自のデリゲート(UITabBarDelegate)があり、変更することはできません。

だから、今このクラスはUITabBarDelegateの両方がある(UITabBarControllerは、そのプロトコルを実装しているため)、およびUITabBarControllerDelegate、そしてあなたのような、/上書きし、必要に応じてそれらのデリゲートのメソッドを実装することができます

// UITabBarDelegate 
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { 
    print("Selected item") 
} 

// UITabBarControllerDelegate 
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { 
    print("Selected view controller") 
} 

私は推測していますあなたはおそらく後者にもっと興味があります。これらの代理人のそれぞれが何を提供しているかは、ドキュメントを参照してください。

あなたのストーリーボード(ストーリーボードを使用していることを前提としています)で最後に、アイデンティティインスペクタでタブバーコントローラのクラスをMyTabBarControllerに設定してください。

+0

答えが豊富です。もし、私のViewControllerにメソッドがあるとしたら、ユーザがタブバーにヒットしたときに実装したいのですが、VCをTabBarDelegateに変換する必要があります。すべて。もしあなたが言及しているなら、他の方法。しかし、私はVCでそのメソッドを実装したい場合は、新しいTabBarControllerから自分のVCにメッセージを送信するためにプロトコルやその他の方法を使用するだけで済むでしょうか? – Manganese

+1

@Manganeseこれは、あなたの要件に基づいて建築上の決定に至ります。ほとんどの場合と同様に、実行したいことを実装する方法は複数あります。あなたがしようとしていることについてもっと詳しく説明できるなら、私は自分の考えを分かち合うことができます。あなたが参照しているメソッドをすべてのVCに実装しますか?プロトコルはここでは便利かもしれませんが、あなたの要件に基づいて他のオプションが利用可能である可能性があります。 – mbeaty

+0

偉大な、基本的に私は2つのタブバーがあります - 1つは私のメインVCで、もう1つはSettings VCです。設定は、ゲームレベルのリセット、オーディオのオン/オフなどです。メインVCは、ユーザーがほとんどの時間になると予想される場所です。ただし、いくつかの設定を変更しない限りです。私は主VCにある設定が変更された場所を知りたい。そのため、設定ビューの属性の変更で変更されるタイププロパティを格納するクラスを作成しました。そこから、結果を使用してメインVCを設定します。その結果、ユーザーがメインVCにナビゲートするとすぐに設定が有効になります。 – Manganese

23

この方法は私にエラーChanging the delegate of a tab bar managed by a tab bar controller is not allowed

の原因となった。これは私がやったことであり、それあなたがviewDidLoad

  • UITabBarControllerDelegate
  • セットデリゲートを継承ViewControllerあなたに

    1. を働いたことをやって関数を追加する

    例:

    class MyClass: UIViewController, UITabBarControllerDelegate { 
    
        func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 
         let tabBarIndex = tabBarController.selectedIndex 
         if tabBarIndex == 0 { 
          //do your stuff 
         } 
        } 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
         self.tabBarController?.delegate = self 
        } 
    
    } 
    
  • +0

    非常に素晴らしいです! –

    +0

    didSelectメソッドが呼び出されませんでした。どのようにそれを解決することができます。 –

    +1

    あなたのviewDidLoadの@ShahbazAkramは、次の行を追加します:self.tabBarController?.delegate = self – Gulz

    0

    ここではもう少し文脈での@ mbeatyの答えのバージョンです。それは私のfuller answer hereから適合しています。

    import UIKit 
    
    class MyTabBarController: UITabBarController, UITabBarControllerDelegate { 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
         // tell our UITabBarController subclass to handle its own delegate methods 
         self.delegate = self 
        } 
    
        // called whenever a tab button is tapped 
        func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 
    
         if let firstVC = viewController as? FirstViewController { 
          firstVC.doSomeAction() 
         } 
    
         if viewController is FirstViewController { 
          print("First tab") 
         } else if viewController is SecondViewController { 
          print("Second tab") 
         } 
        } 
    
        // alternate method if you need the tab bar item 
        override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { 
         // ... 
        } 
    } 
    

    IBのタブビューコントローラのカスタムクラスとして設定します。

    enter image description here

    代替ソリューション

    • だけでタブのビューコントローラのviewDidLoad方法で何かをします。 this answerを参照してください。
    関連する問題