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


159

たとえばUIButton、iPhoneアプリに1つのタブビューがあり、のタブバーで別のタブを開くとしますTabBarController。これを行うためのコードをどのように記述しますか?

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


:私は私の[質問] [1] [1]で、みんなの助けを借り、上記の方法で問題を抱えてstackoverflow.com/questions/19742416/...
ローマSimenok

回答:


399

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

迅速

self.tabBarController.selectedIndex = 1

Objective-C

[self.tabBarController setSelectedIndex:1];

8
インデックスがMoreビューコントローラ内のタブにマップされている場合(5つ以上のタブがある場合)、これは機能しないことに注意してください。その場合は、を使用してください-setSelectedViewController:
Joe D'Andrea

これを行った後、タブが正常に変更された後、通常はタブバーを選択できなくなります。更新:これは、プログラムでタブを交換する直前にpopToRootViewControllerを呼び出すことに何らかの関係がありました。
Adam Johns

しかし、タブを切り替えたい場合、Selfは機能しません。ユーザーが[OK]を押すと、今度はタブ3をクリックしてalertViewを表示するとします。もう一度タブ1に切り替えます。現在のオブジェクトではないため、自己は正しくありません。正しい?
Alix、2014

これはうまく機能しますが、タブを切り替えながらデータを渡す必要もあります。タブにラベルを付けましたが、タブに切り替えるとすぐに更新する必要があります。これに対する簡単な解決策はありますか?
Md Rais

@AdamJohnsどのようにして問題を解決することができましたか。ネイティブのtabBarのように動作するようにします。2回目のクリックでrootViewControllerにポップするはずです。
Waqas

20

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

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

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


12

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

切り替えるビューコントローラのオブジェクト参照がある場合は、次の操作を実行できます。

tabBarController.selectedViewController = myViewController

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


私はmoreNavControllerを選択する必要があり、それが私の知る限りそれを行う唯一の方法です
Ossir

9

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


6
1つの小さな違いは、ユーザーがタブを切り替えることを通知できるデリゲートメソッドが呼び出されないことです。
Brad The App Guy

3
selectedIndexまた、インデックスが4を超えると設定が機能しませんが、selectedViewController機能します。
Bugloaf 2012

3

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

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

2

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

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

2

スチュアートクラークのソリューションと同様ですが、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 {

ループなし、ナビゲーションコントローラーなし:func selectViewController <ViewControllerModel>(type:ViewControllerModel.Type){self.selectedViewController = self.viewControllers?.first(where:{viewController in viewController is ViewControllerModel})}
dev_exo

1

IBではなく、IBの接続方法に依存しない堅牢なソリューションを実現できると思ったので、インデックスではなくクラスで表示されるタブを指定できるようにしたいと思いました。Discoと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]];

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


これはうまくいきました!別の答えでSwift3用に書き直しました。
Json、

1

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

tabBarController.selectedIndex = 2

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

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}

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

スチュアートクラークのソリューションと同様ですが、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に設定する必要があります。または、Storyboard IDを使用して、「Use Storyboard 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
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)
}



}

1
通常は、匿名のコードのいくつかの行を投稿するだけでなく、解決策を説明する方が良いでしょう。どのようにすれば良い答えを書くことができ、完全にコードベースの答えを説明する
Anh Pham
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.