5987
storyboardで生成したUITabBarControllerを用いて、それぞれのViewで異なる効果音を鳴らし、TabBarをタップすると、他のViewに遷移したときに元いたViewの効果音を止める、という動作を書きたいのですが、  
とりあえず分かっていることは「viewDidLoadに効果音再生のコードを書く」ということだけで、  
前の質問([UITabBarControllerでの切り替えに応じた処理について(Swift)](https://ja.stackoverflow.com/questions/5924/uitabbarcontroller\)%E3%81%A7%E6%95%99%E3%81%88%E3%81%A6%E9%A0%82%E3%81%84%E3%81%9F)、TabBarItemのボタンの原理はイマイチよく理解できませんでした。

(前の質問で言うと `tabBarController.tabBar.delegate = self`
で「delegateというクラスは存在しない」と表示され、つまづきました。)

storyboardでのView内では一つしかTabBarItemが表示されていないので、該当する全てのViewに同じコードを書かなければならないのですか？  
UITabBarItemにActionがあれば楽なのですが……

```

    import UIKit
    import AVFoundation
    
    class HomeView: UIViewController, AVAudioPlayerDelegate, UITabBarDelegate {
    
        //サウンドの変数宣言
        var myTabSound: AVAudioPlayer!
    
        @IBOutlet weak var myTabBar: UITabBarItem!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            myTabBar.tabBar.delegate = self
            //↑ここでつまづき、他に思いつくdelegateを含むコードを書いてもエラーになる
    
            //サウンドのソースコード生成
            let soundFilePath: NSString = NSBundle.mainBundle().pathForResource("effect8", ofType: "mp3")!
            let fileURL : NSURL = NSURL(fileURLWithPath: soundFilePath)!
            //AVAudioPlayerのインスタンス化
            myTabSound = AVAudioPlayer(contentsOfURL: fileURL, error: nil)
            //AVAudioPlayerのデリゲートをセット
            myTabSound.delegate = self
        }
    
        func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
            if(item.tag == 1){
                //効果音を鳴らす
                myTabSound.play()
            }
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
```

お詳しい方がいましたら、どうか回答宜しくお願い致します。
CC BY-SA 3.0
2015-02-04T15:53:31.510
5952
2015-02-07T12:06:11.450
2017-04-13T12:52:38.920
-1
5832
question
swift storyboard uitabbarcontroller
UITabBarControllerにて、それぞれのViewで異なる効果音を鳴らす
UITabBarのDelegate先は、UITabBarControllerに固定されているようです。プログラムで変更すると、アプリがエラーで落ちます。

  1. なので、UITabBarControllerのサブクラスを作り、Storyboard上でTabBar  
Controllerのクラスを変更。 Delegateメソッドは、UITabBarControllerサブクラスに記述。

  2. UITabBarControllerが、UITabBarDelegateを実装しているので、サブクラスに再実装する必要はなし。
  3. Delegateメソッドにはoverrideオプションをつける。

私の考えでは、UITabBarDelegateを使わずに、 **UITabBarControllerDelegate** を使って、TabBar
Itemタップ時の処理を行うほうが、いいでしょう。UITabBarControllerDelegateは、アプリ起動時、存在するインスタンスなら、実装できます。  
（最初のタブのViewController以外は、タップして表示するまで、生成されていませんので、注意してください）  
UITabBarControllerDelegateのメソッド「optional func **tabBarController** (_
tabBarController: UITabBarController, **didSelectViewController**
viewController: UIViewController)」を利用するのがいいでしょう。
CC BY-SA 3.0
2015-02-05T08:50:46.513
5987
2015-02-05T08:50:46.513
7362
5952
answer