web-dev-qa-db-ja.com

UITabBar(Controller)-タップされたインデックスを取得しますか?

私はタブバーアプリケーションを持っています。適切な通知などを表示するために、ユーザーがタブバーをいつどのボタンでタップするかを知る必要があります。

要するに:ITabBarでタップされたUITabBarItemのインデックスを検出するにはどうすればよいですか?

前もって感謝します!

29
esqew

答えは、UITabBarがUITabBarControllerによって管理されているかどうかによって異なります。

ケース1-UITabBarはすでにUITabBarControllerによって処理されています

UITabBarControllerDelegateプロトコルを実装します。具体的には、tabBarContoller:didSelectViewController:メソッドです。プロトコルを実装するクラスのインスタンスをdelegateUITabBarControllerとして設定します。

- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
    NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
    NSLog(@"Tab index = %u (%u)", (int)indexOfTab);
}

この場合、タブコントローラーに十分なコントローラーがあり、[詳細]タブが表示されるという特別な状況に注意する必要があります。その場合、リストにないビューコントローラー(内部UIKitクラスUIMoreNavigationControllerのインスタンス)を使用してtabBarController:didSelectViewController:への呼び出しを受け取ります。その場合、私のサンプルのindexOfTabNSNotFoundになります。

ケース2-UITabBarはUITabBarControllerによってまだ処理されていません

UITabBarDelegateプロトコルを実装します。具体的には、tabBar:didSelectItem:メソッドです。プロトコルを実装するクラスのインスタンスをdelegateUITabBarとして設定します。

- (void)tabBar:(UITabBar *)theTabBar didSelectItem:(UITabBarItem *)item {
    NSUInteger indexOfTab = [[theTabBar items] indexOfObject:item];
    NSLog(@"Tab index = %u", (int)indexOfTab);
}

編集:隠されているtabBarControllerに関するOPのコンパイル警告を排除するために、メソッドパラメーター変数を変更しました。

97
imaginaryboy

スウィフト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))")
}
8
lenooh

UITabBarDelegateプロトコルにはtabBar:didSelectItem:と呼ばれるメソッドが定義されており、UITabBarItemが選択された(タップされた)ときに通知されます。

6
Jacob Relkin

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
}
5
dengApro

私はこのようにしました:これは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]);
}
2
Shishi

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()
0
comm1x