web-dev-qa-db-ja.com

プログラムでTabBarタブビューに切り替えますか?

IPhoneアプリの1つのタブビューにUIButtonがあり、TabBarControllerのタブバーに別のタブを開いてほしいとしましょう。これを行うコードをどのように記述しますか?

既存のビューをアンロードし、特定のタブビューをロードすると仮定していますが、コードを正確に記述する方法がわかりません。

151
rottendevice

SwiftまたはObjective-Cでこのコードを試してください

スイフト

self.tabBarController.selectedIndex = 1

Objective-C

[self.tabBarController setSelectedIndex:1];
386
Jordan

タブのインデックスは0から始まることに注意してください。したがって、次のコードスニペットは機能します。

tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];

バーの5番目のタブに移動します。

20
John Smith

私の意見では、selectedIndexまたはobjectAtIndexを使用することがタブを切り替える最良の方法ではないということです。タブの順序を変更すると、ハードコードされたインデックスの選択が以前のアプリの動作を台無しにする可能性があります。

切り替えたいView Controllerのオブジェクト参照がある場合、次のことができます。

tabBarController.selectedViewController = myViewController

もちろん、myViewControllerが本当にtabBarController.viewControllersのリストにあることを確認する必要があります。

11
ThomasT

UITabBarControllerのselectedIndexプロパティを適切なインデックスに設定するだけで、ユーザーがタブボタンをタップしたようにビューが変更されます。

9
Alex Deem

Disco S2が提案したことを試しましたが、それは近いものでしたが、これが私のために働いたのです。これは、別のタブ内でアクションを完了した後に呼び出されました。

for (UINavigationController *controller in self.tabBarController.viewControllers)
{
    if ([controller isKindOfClass:[MyViewController class]])
    {
        [self.tabBarController setSelectedViewController:controller];
        break;
    }
}
3
Joped

タブを移動する場合のために、いくつかのコードを示します。

for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
            if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
                [self.tabBarController setSelectedViewController:controller];
                break;
            }
        }
2
StuStirling

Stuart Clarkのソリューションと似ていますが、Swift 3の場合:

func setTab<T>(_ myClass: T.Type) {
    var i: Int = 0
    if let controllers = self.tabBarController?.viewControllers {
        for controller in controllers {
            if let nav = controller as? UINavigationController, nav.topViewController is T {
                break
            }
            i = i+1
        }
    }
    self.tabBarController?.selectedIndex = i
}

次のように使用します。

setTab(MyViewController.self)

TabControllerがnavigationControllersの背後にあるviewControllersにリンクしていることに注意してください。 navigationControllersがなければ、次のようになります。

if let controller is T {
1
David

私の問題は少し異なります。1番目のtabBarの1つのchildViewControllerから2番目のtabBarのhome viewControllerに切り替える必要があります。私は単に2階で提供されるソリューションを使用します。

tabBarController.selectedIndex = 2

ただし、2番目のtabBarのホームページに切り替えたとき、コンテンツは表示されません。そして、viewDidAppear、viewWillAppear、viewDidLoadをデバッグするときに、どれも呼び出されません。私の解決策は、UITabBarControllerに次のコードを追加することです。

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}
1
Jin

IBの接続方法にあまり依存しない堅牢なソリューションを実現できると考えたため、インデックスではなくクラスによって表示されるタブを指定できるようにしたかったのです。私は、ディスコのソリューションもJopedのソリューションも動作するものが見つからなかったため、このメソッドを作成しました。

-(void)setTab:(Class)class{
    int i = 0;
    for (UINavigationController *controller in self.tabBarContontroller.viewControllers){
        if ([controller isKindOfClass:class]){
            break;
        }
        i++;
    }
    self.tabBarContontroller.selectedIndex = i;
}

次のように呼び出します:

[self setTab:[YourClass class]];

これが誰かに役立つことを願って

1
Stuart Clark
import UIKit

class TabbarViewController: UITabBarController,UITabBarControllerDelegate {

//MARK:- View Life Cycle

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

//Tabbar delegate method
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
    yourView.popToRootViewController(animated:false)
}



}
0

AppDelegate.mファイルで使用:

(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 me %u",self.tabBarController.selectedIndex);
            break;
        case 1:
            NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
            break;

        default:
            break;

    }

}
0
Rakesh Singh

Stuart Clarkのソリューションと似ていますが、Swift 3および正しい識別子を見つけるために復元識別子を使用します:

private func setTabById(id: String) {
  var i: Int = 0
  if let controllers = self.tabBarController?.viewControllers {
    for controller in controllers {
      if let nav = controller as? UINavigationController, nav.topViewController?.restorationIdentifier == id {
        break
      }
      i = i+1
    }
  }
  self.tabBarController?.selectedIndex = i
}

次のように使用します(「Humans」と「Robots」も特定のviewControllerおよびその復元IDのストーリーボードで設定する必要があります。または、ストーリーボードIDを使用して、「ストーリーボードIDを使用」を復元IDとしてチェックします):

struct Tabs {
    static let Humans = "Humans"
    static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)

TabControllerがnavigationControllersの背後にあるviewControllersにリンクしていることに注意してください。 navigationControllersがなければ、次のようになります。

if controller.restorationIdentifier == id {
0
David