UITabBarController は複数の UIViewController を独立して表示することができますが、各 UIViewController 間の関係の制御はあまり良く制御できません。特に最後に選択したタブの番号を記録していない場合、特定の要件を実現するのが困難になります。例えば、A タブでイベントを通じて最後に選択した B タブに切り替えたり、A タブのイベントで B タブに切り替えてから処理が完了した後に A タブに戻る必要がある場合などです。UITabBarController で前回選択したタブの番号を知ることができれば、このような要件を満たすことができます。
参考コード
//MyTabBarController.h
@interface MyTabBarController : UITabBarController {
// 最後に選択した Index
NSUInteger _lastSelectedIndex;
}
@property(readonly, nonatomic) NSUInteger lastSelectedIndex;
@end
//MyTabBarController.m
@implementation MyTabBarController
@synthesize lastSelectedIndex=_lastSelectedIndex;
-(void)setSelectedIndex:(NSUInteger)selectedIndex
{
// 等しくない場合のみ設定
if (self.selectedIndex != selectedIndex) {
// 最後に選択した Index を設定
_lastSelectedIndex = self.selectedIndex;
NSLog(@"1 OLD:%d , NEW:%d",self.lastSelectedIndex,selectedIndex);
}
//親クラスのsetSelectedIndexを呼び出す
\[super setSelectedIndex:selectedIndex\];
}
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
// 選択された item を取得
NSUInteger tabIndex = [tabBar.items indexOfObject];
if (tabIndex != self.selectedIndex) {
// 最後に選択した Index を設定
_lastSelectedIndex = self.selectedIndex;
NSLog(@"2 OLD:%d , NEW:%d",self.lastSelectedIndex,tabIndex);
}
}
@end
実装する際には、-(void) setSelectedIndex:(NSUInteger) selectedIndex と - (void) tabBar:(UITabBar *) tabBar didSelectItem:(UITabBarItem *) item の両方を表示する必要があります。readonly な lastSelectedIndex を追加することで、最後に選択した Index を取得できます。