回答:
このコードをSwiftまたはObjective-Cで試してください
迅速
self.tabBarController.selectedIndex = 1
Objective-C
[self.tabBarController setSelectedIndex:1];
-setSelectedViewController:
。
私の意見では、selectedIndex
またはを使用することobjectAtIndex
が必ずしもタブを切り替える最良の方法ではありません。タブを並べ替えると、ハードコードされたインデックスの選択が以前のアプリの動作を台無しにする可能性があります。
切り替えるビューコントローラのオブジェクト参照がある場合は、次の操作を実行できます。
tabBarController.selectedViewController = myViewController
もちろん、確認する必要があります。これmyViewController
は本当にのリストにありtabBarController.viewControllers
ます。
selectedIndex
UITabBarController のプロパティを適切なインデックスに設定するだけで、ユーザーがタブボタンをタップしたようにビューが変更されます。
selectedIndex
また、インデックスが4を超えると設定が機能しませんが、selectedViewController
機能します。
私はディスコS2が提案したものを試しました、それは近かったですが、これは結局私のために働いたものです。これは、別のタブ内でアクションを完了した後に呼び出されました。
for (UINavigationController *controller in self.tabBarController.viewControllers)
{
if ([controller isKindOfClass:[MyViewController class]])
{
[self.tabBarController setSelectedViewController:controller];
break;
}
}
タブを移動する可能性がある場合のために、いくつかのコードを次に示します。
for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
[self.tabBarController setSelectedViewController:controller];
break;
}
}
スチュアートクラークのソリューションと同様ですが、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 {
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]];
これが誰かに役立つことを願っています
私の問題は少し異なり、1番目のtabBarの1つのchildViewControllerから2番目のtabBarのホームviewControllerに切り替える必要があります。私は2階で提供されているソリューションを使用するだけです。
tabBarController.selectedIndex = 2
ただし、2番目のtabBarのホームページに切り替えると、コンテンツは表示されません。そして、私がデバッグすると、viewDidAppear、viewWillAppear、viewDidLoadのいずれも呼び出されません。私の解決策は、UITabBarControllerに次のコードを追加することです。
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}
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;
}
}
スチュアートクラークのソリューションと同様ですが、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 {
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)
}
}