私はタブバーアプリケーションを持っています。適切な通知などを表示するために、ユーザーがタブバーをいつどのボタンでタップするかを知る必要があります。
要するに:ITabBarでタップされたUITabBarItemのインデックスを検出するにはどうすればよいですか?
前もって感謝します!
答えは、UITabBarがUITabBarControllerによって管理されているかどうかによって異なります。
ケース1-UITabBarはすでにUITabBarControllerによって処理されています
UITabBarControllerDelegate
プロトコルを実装します。具体的には、tabBarContoller:didSelectViewController:
メソッドです。プロトコルを実装するクラスのインスタンスをdelegate
のUITabBarController
として設定します。
- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
NSLog(@"Tab index = %u (%u)", (int)indexOfTab);
}
この場合、タブコントローラーに十分なコントローラーがあり、[詳細]タブが表示されるという特別な状況に注意する必要があります。その場合、リストにないビューコントローラー(内部UIKitクラスUIMoreNavigationControllerのインスタンス)を使用してtabBarController:didSelectViewController:
への呼び出しを受け取ります。その場合、私のサンプルのindexOfTab
はNSNotFound
になります。
ケース2-UITabBarはUITabBarControllerによってまだ処理されていません
UITabBarDelegate
プロトコルを実装します。具体的には、tabBar:didSelectItem:
メソッドです。プロトコルを実装するクラスのインスタンスをdelegate
のUITabBar
として設定します。
- (void)tabBar:(UITabBar *)theTabBar didSelectItem:(UITabBarItem *)item {
NSUInteger indexOfTab = [[theTabBar items] indexOfObject:item];
NSLog(@"Tab index = %u", (int)indexOfTab);
}
編集:隠されているtabBarController
に関するOPのコンパイル警告を排除するために、メソッドパラメーター変数を変更しました。
スウィフト3:
// somewhere inside your TabBarViewController
//...
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
let indexOfTab = tabBar.items?.index(of: item)
print("pressed tabBar: \(String(describing: indexOfTab))")
}
UITabBarDelegate
プロトコルにはtabBar:didSelectItem:
と呼ばれるメソッドが定義されており、UITabBarItem
が選択された(タップされた)ときに通知されます。
Swift 4:
私は好む
// somewhere inside your TabBarViewController
//...
func tabBarController(_ tabBarController: UITabBarController,
shouldSelect viewController: UIViewController) -> Bool{
let index = tabBarController.viewControllers?.index(of: viewController)
return true// you decide
}
私はこのようにしました:これはUITabBarControllerを拡張するカスタムクラスにあります
.h
@interface CustomTabBarController : UITabBarController<UITabBarDelegate>
.m
-(void)tabBar:(UITabBar *)theTabBar didSelectItem:(UIViewController *)viewController
{
NSLog(@"Tab index = %@ ", theTabBar.selectedItem);
for(int i = 0; i < theTabBar.items.count; i++)
{
if(theTabBar.selectedItem == theTabBar.items[i])
{
NSLog(@"%d",i);// this will give the selected tab
}
}
//NSlog(@"Items = %@", theTabBar.items[0]);
}
Swift 4の単純な拡張:
extension UITabBarController {
func getSelectedTabIndex() -> Int? {
if let selectedItem = self.tabBar.selectedItem {
return self.tabBar.items?.firstIndex(of: selectedItem)
}
return nil
}
}
そして使い方:
let index = getSelectedTabIndex()