单击 UITabbarItem 打开 UIViewController

Open UIViewController upon clicking on UITabbarItem

我创建了一个带有 UITabbar 的 UIViewController。

我没有使用 UITabbarController,因为我希望 UITabbar 位于屏幕顶部。

单击 tab1 时,我想显示控制器 1,单击 tab2 时,我想显示控制器 2。我不想隐藏标签栏。我想在标签栏下方显示控制器。

@interface MTLeaderFactoViewController () <UITabBarDelegate>
@property (weak, nonatomic) IBOutlet UITabBar *tabBar;
@end

@implementation MTLeaderFactoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
    if (item.tag == 0) {
        NSLog(@"item tag 0");
    } else {
        NSLog(@"item tag 1");
    }
}
@end

我的问题:

1) didSelectItem 即使使用 UITabbarDelegate

方法也没有触发

2) 单击按钮时显示控制器的最优雅方式是什么?我不想使用 segue,因为所有控制器都在不同的故事板中。 目前,我打算做

Controller1 *fp = [Controller1 controllerStoryboard:STORYBOARD_COURSE];
[self addChildViewController:fp];
[self.view addSubview:fp.view];
[fp didMoveToParentViewController:self];

编辑 1:

    Controller1 *fp = [Controller1 controllerStoryboard:STORYBOARD_COURSE];
    [self addChildViewController:fp];
    [self.view addSubview:fp.view];
    [fp didMoveToParentViewController:self];

试过了,但它隐藏了标签栏。我想利用标签栏下方的space来显示控制器

你需要做的是有一个 basecontroller class 它将包含一个标签栏(以编程方式创建)然后你可以在这里获得所需的输出我创建的示例 baseController,

import UIKit

class BaseViewController: UIViewController,UITabBarDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        let myTabBar = UITabBar()
        myTabBar.frame = CGRect(x: 0, y: 60, width:self.view.frame.size.width, height: 50)

        let one = UITabBarItem()
        one.title = "one"
        one.tag = 1
        let two = UITabBarItem()
        two.title = "two"
        two.tag = 2
        myTabBar.setItems([one,two], animated: false)
        self.view.addSubview(myTabBar)
        myTabBar.delegate = self

    }


    func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        switch item.tag  {
        case 1:
            let controller = storyboard?.instantiateViewController(withIdentifier: "SecondViewController")
            addChildViewController(controller!)
            view.addSubview((controller?.view)!)
            controller?.didMove(toParentViewController: self)
            break
        case 2:
            let controller = storyboard?.instantiateViewController(withIdentifier: "ViewController")
            addChildViewController(controller!)
            view.addSubview((controller?.view)!)
            controller?.didMove(toParentViewController: self)
            break
        default:
            break
        }

    }

}

视图控制器class:

import UIKit

class ViewController: BaseViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
                // Do any additional setup after loading the view, typically from a nib.
    }


}

第二个视图控制器:

import UIKit

class SecondViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }



}

我建议使用 UITabBarController 而不是 UIViewController。

在您的 StoryBoard 中添加 UITabViewController,将其命名为 FirstTabBarController。

将 child 视图控制器添加到 FirstTabBarController。在你的所有 child 视图中添加 UITabbar。将 TabBar 委托连接到每个 child ViewController。

在默认的 FirstTabBarController 中隐藏默认的 TabBar。

- (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     self.tabBar.isHidden = true;
     [self setSelectedIndex:1];
  }

在您的 child ViewController 中向 TabBar 添加操作作为

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
   NSUInteger index = [[theTabBar items] indexOfObject:item];
   NSLog(@"Tab index = %u", (int)indexO);
   [self.navigationController.tabBarController setSelectedIndex:index];
}

我更喜欢这种方法,而不是手动添加或删除 ViewController 作为子视图,让 UITabBarController 为您管理。如果您有进一步的疑问,请告诉我。