IPhoneアプリの1つのタブビューにUIButton
があり、TabBarController
のタブバーに別のタブを開いてほしいとしましょう。これを行うコードをどのように記述しますか?
既存のビューをアンロードし、特定のタブビューをロードすると仮定していますが、コードを正確に記述する方法がわかりません。
SwiftまたはObjective-Cでこのコードを試してください
スイフト
self.tabBarController.selectedIndex = 1
Objective-C
[self.tabBarController setSelectedIndex:1];
タブのインデックスは0から始まることに注意してください。したがって、次のコードスニペットは機能します。
tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];
バーの5番目のタブに移動します。
私の意見では、selectedIndex
またはobjectAtIndex
を使用することがタブを切り替える最良の方法ではないということです。タブの順序を変更すると、ハードコードされたインデックスの選択が以前のアプリの動作を台無しにする可能性があります。
切り替えたいView Controllerのオブジェクト参照がある場合、次のことができます。
tabBarController.selectedViewController = myViewController
もちろん、myViewController
が本当にtabBarController.viewControllers
のリストにあることを確認する必要があります。
UITabBarControllerのselectedIndex
プロパティを適切なインデックスに設定するだけで、ユーザーがタブボタンをタップしたようにビューが変更されます。
Disco 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;
}
}
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番目のtabBarの1つのchildViewControllerから2番目のtabBarのhome viewControllerに切り替える必要があります。私は単に2階で提供されるソリューションを使用します。
tabBarController.selectedIndex = 2
ただし、2番目のtabBarのホームページに切り替えたとき、コンテンツは表示されません。そして、viewDidAppear、viewWillAppear、viewDidLoadをデバッグするときに、どれも呼び出されません。私の解決策は、UITabBarControllerに次のコードを追加することです。
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}
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]];
これが誰かに役立つことを願って
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)
}
}
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;
}
}
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 {