单击UITabbarItem打开UIViewController

时间:2017-07-26 06:54:19

标签: ios objective-c uitabbar uitabbaritem

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

enter image description here

我没有使用UITabbarController,因为我想在屏幕顶部显示UITabbar。

单击tab1时,我想显示controller1,然后单击tab2我想要显示控制器2.我不想隐藏tabbar。我想在标签栏下面显示控制器。

@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)即使在使用UITabbarDelegate

后也未触发 didSelectItem 方法

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];

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

2 个答案:

答案 0 :(得分:2)

你需要做的是有一个basecontroller类,它将包含一个tabbar(以编程方式创建)然后你可以实现所需的输出继承我创建的示例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
        }

    }

}

查看控制器类:

import UIKit

class ViewController: BaseViewController {


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


}

SecondView控制器:

import UIKit

class SecondViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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



}

答案 1 :(得分:1)

我建议使用UITabBarController而不是UIViewController。

在StoryBoard中添加UITabViewController,将它命名为FirstTabBarController。

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

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

endsWith()

在您的子ViewController中将操作添加到TabBar

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

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