web-dev-qa-db-ja.com

iPhoneアプリ-どのタブバー項目が押されたかを検出

タブバーベースのアプリケーションで、5つ以上のタブバーアイテムを使用しているので、そのうち4つを直接ビューに表示し、[その他]タブを選択して残りを利用できます。タブバーのアイテムが押されたとき、それがどれだったかを検出したい。
したがって、
- (void)tabBarController:(UITabBarController *)tabBarCtrl didSelectViewController:(UIViewController *)viewControllerメソッド、tabBarCtrl.selectedViewController.titleを使用してアイテムのタイトルを取得します。

これは、ビューに表示されているタブ(つまり、最初の4つのタブと[その他]タブ)で機能しますが、[その他]タブを押した後にリストに表示される残りのタブバーアイテムでは機能しません。

[もっと見る]リストからタブを選択すると、didSelectViewControllerメソッドが呼び出されないこともわかります。
押されたときにどのようにしてそれらを検出できますか?

前もって感謝します。

18
CdB

詳細セクションでUITabBarItemのタイトルを取得する方法

- (void)tabBarController:(UITabBarController *)tabBarController 
 didSelectViewController:(UIViewController *)viewController
{
    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);

    if (viewController == tabBarController.moreNavigationController)
    {
        tabBarController.moreNavigationController.delegate = self;
    }
}
21
0x8badf00d

UIViewControllerで次のコードを使用すると、選択したアイテムのインデックスにアクセスできます。 alwaysはタブのインデックスを返します。

_self.tabBarController.selectedIndex;
_

したがって、たとえば「More ...」タブに移動できる6つのアイテム、「5番目」のアイテムを選択すると、selectedIndexは4になります。 [その他]タブに移動して6番目のアイテムを選択すると、5が返されます。


編集: UITabBarItemの現在の位置を確認する場合は、次のようにできます。

最初に、XIBファイルで、各タブのtagプロパティを編集して、1番目のタブにtag = 100、2nd-200、3rd-300などを設定する必要があります。

次に、ViewControllerで次のコードを追加します。

_UIViewController *selectedVC = [self.tabBarController.viewControllers objectAtIndex:self.tabBarController.selectedIndex];
int selectedItemTag = selectedVC.tabItem.tag;
_

次に、selectedItemTag変数を使用して、それがどのviewControllerであるかを判別できます。この場合、これを行うことでselectedIndexを決定できます:selectedIndex = (selectedItemTag-100)/100

tagプロパティはnotがUITabBarのカスタマイズ時に変更されるため、信頼できる:)

15
akashivskyy

UITabBarDelegateメソッドを使用してタブが押されたことを検出できます: http://developer.Apple.com/library/ios/#documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference。 html#// Apple_ref/occ/intf/UITabBarDelegate

UITabBarControllerクラスをデリゲートにして、実装にメソッドを追加できます。

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    NSLog(@"tab selected: %@", item.title); 
} 
5
Ken Pespisa

1。したがって、UITabBarControllerを使用している場合は、クラスにUITabBarControllerDelegateを実装させ、UITabBarControllerデリゲートを次のクラスに設定できます。 TabBarで選択された項目が変更されたときに通知を受ける必要があり、次にデリゲートメソッドをクラスに追加します。

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

このメソッド内では、UITabBarController selectedIndexプロパティを使用して、現在選択されているインデックスがどれかを知ることができます。

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:      (UIViewController *)viewController
{
    NSLog(@"Selected index: %d", tabBarController.selectedIndex);
}

2。UITabBarだけを使用していない場合は、この投稿のKen PespisaとiCoderによる回答をここで追跡できます- Ken Pespisa and iCoder この投稿。

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

 NSLog(@"Selected index: %d", tabBarController.selectedIndex);

if (viewController == tabBarController.moreNavigationController)
{
    tabBarController.moreNavigationController.delegate = self;
}

NSUInteger selectedIndex = tabBarController.selectedIndex;

switch (selectedIndex) {

    case 0:
        NSLog(@"click tabitem %u",self.tabBarController.selectedIndex);
        break;
    case 1:
        NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
        break;

    default:
        break;

}

}
2
Rakesh Singh

[〜#〜] every [〜#〜]UITabBarItemにタグを追加するので(インデックス5以上のものでも)。

次のコードを使用して、選択されたタブを追跡できます。

//MARK: - UITabBarControllerDelegate

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {

    if viewController == tabBarController.moreNavigationController {
        tabBarController.moreNavigationController.delegate = self
    } else {
        setSelectedTabBarOption()
    }
}


//MARK: - UINavigationControllerDelegate

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    setSelectedTabBarOption()
}


private func setSelectedTabBarOption() {

    if let viewControllers = viewControllers {
        let selectedController: UIViewController? = viewControllers.count > selectedIndex ? viewControllers[selectedIndex] : nil
        if let tag = selectedController?.tabBarItem.tag {
            //do whatever with your tag
        }
    }
}

タブバーコントローラーを使用している場合は、タブアイテムとビューコントローラー間のマッピングについて知らないようにする必要があります。それがタブバーコントローラーの仕事です。他の目的でタブバーを使用する場合は、UITabBarControllerを使用せずに、UITabBarを直接使用する必要があります。 UITabBarを使用する場合、独自のオブジェクトをタブバーのデリゲートとして設定でき、デリゲートは、選択されたアイテムが変更されるたびにメッセージを取得します。

1
Caleb