UITabBarControllerでのタブの切り替えのイベント処理 | My Footprint

My Footprint

どんな靴を履いてても、歩けば僕の足跡。
目標に向かって歩き続ける日々を書いていくブログです。

今日iOSでのタブについて調べてたんですが、タブの切り替え時のイベントはどう実装するのか
気になって調べたら意外とちゃんとした情報が無かったのでやってみました。


まず、切り替えのイベントはUITabBarControllerDelegateを実装し、

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

で受け取ります。


で、色々ネット見てると、このなかでviewControllerのインスタンスを調べたりして条件分岐とか
させてるのが多かったんだけど、個人的には各controllerで処理が出来た方が汎用的じゃないかなぁと思ったので実装してみました。


やることとしては

  • UITabBarControllerのサブクラスを作成、上のデリゲートメソッドを実装しイベントを受け取る

  • プロトコルをUITabBarControllerに作成し、各UIViewControllerに実装させる。

  • イベントを受け取ったら各UIViewControllerに処理をさせる



です。
説明するのが下手なので分かりにくいですね^^;

ポイントとしてはUITabBarControllerのデリゲートに自分自身を設定するところです。
UITabBarControllerのデリゲートに各タブのUIViewControllerを設定してしまうと
タブが選択されたときに全てのイベントが固定のUIViewControllerにしか行かないからです。
UITabBarControllerのオブジェクトは一つしかなく、デリゲートも一つしか持てないですからね。

なのでUITabBarControllerの継承クラスを作り、各タブにイベントを振ってやろうという魂胆です。


まずxcodeでプロジェクトを作成します。
Tabのテンプレートを選択します。

$My Footprint


次にUITabBarControllerを継承したクラスを作成します。


$My Footprint

ここでは適当にMyTabBarContollerと名付けます。


クラスを作成したらstoryboardのほうからUITabBarControllerのviewにMyTabBarControllerを指定します。


$My Footprint


これでMyTabBarControllerに処理が入ってきます。

次にMyTabBarControllerにUITabBarControllerDelegateを実装します。
まずヘッダーファイルを以下のようにします。

@interface MyTabBarController : UITabBarController<UITabBarControllerDelegate>

@end

さらに各タブとなるUIViewController用にプロトコルを宣言します。

@protocol MyTabBarControllerDelegate

- (void) didSelect:(MyTabBarController*) tabBarController;

@end

次に.mファイルを開き

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

を実装して行きます。


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

// プロトコルを実装しているかのチェック
if ([viewController conformsToProtocol:@protocol(MyTabBarControllerDelegate)]) {
// 各UIViewControllerのデリゲートメソッドを呼ぶ
[(UIViewController<MyTabBarControllerDelegate>*)viewController didSelect:self];
}

}


ここでは最初にプロトコルを実装しているかチェックをしています。
全てのタブで実装するとは限らないので。

で、実装してあればメソッドを読んで処理を渡してあげます。

また、viewDidLoadなどで自分自身をデリゲートに設定してあげます。


- (void)viewDidLoad
{
[super viewDidLoad];
// 自分自身をデリゲートに設定
self.delegate = self;

}



これで各UIViewController内で自分が選択されたイベントが取れるようになりました。


次に受け取り側を実装していきます。

テンプレートで作ると最初から2つUIViewControllerが出来ているので
それぞれにMyTabBarControllerDelegateを実装していきます。

まずヘッダーでMyTabBarController.hをimportします。

#import "MyTabBarController.h"
@interface FirstViewController : UIViewController<MyTabBarControllerDelegate>

@end

さらに.mファイルを開き次のメソッドを実装します。
今回はとりあえずログをはくだけ。


- (void) didSelect:(MyTabBarController *)tabBarController {
NSLog(@"tab 1");
}


同じようにしてもう片方にも実装します。

これで実行すると以下のようにタブを選択した時に
選択されたUIViewController内で処理を実行することができます。
$My Footprint