【问题标题】:Open UIViewController upon clicking on UITabbarItem点击 UITabbarItem 打开 UIViewController
【发布时间】:2018-01-01 08:10:15
【问题描述】:

我创建了一个 UIViewController,里面有一个 UITabbar。

我没有使用 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];

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

【问题讨论】:

  • 您是否将 UITabbarDelegate 设置为 MTLeaderFactoViewController ?仅仅实现委托方法不会调用委托方法。
  • 将 TabBar 委托连接到 xib/StoryBoard 中的 ViewController
  • 天哪,我的错。感谢您指出这一点。
  • 而我想显示控制器的方式可以吗?
  • 添加子视图将从视图中删除您的标签栏

标签: ios objective-c uitabbar uitabbaritem


【解决方案1】:

您需要做的是有一个 basecontroller 类,它将包含一个标签栏(以编程方式创建),然后您可以获得所需的输出,这是我创建的示例 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.
    }


}

第二视图控制器:

import UIKit

class SecondViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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



}

【讨论】:

  • 这会隐藏标签栏。请检查我的编辑 1
  • 我尝试了一个演示,请检查我的答案视图控制器是基本视图控制器,因此标签栏不会随时隐藏
  • 在标签栏下方再创建一个视图以添加控制器视图 :) 谢谢!
【解决方案2】:

我建议使用 UITabBarController 而不是 UIViewController。

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

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

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

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

在您的子 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 为您管理。如果您有其他疑问,请告诉我。

【讨论】:

  • 嘿-应该没问题。我也熟悉 swift :) 我没有使用 UITabbarController 因为标签栏默认位于底部,我不想添加 hack 将其移动到顶部。
  • 如果我使用UITabbar的方式,你觉得会不会出问题?
  • 那不是黑客。它只是使用默认控制器完成任务的一种方式。子 Viewcontroller 由 TabBarController 本身管理。您不需要在每个视图控制器中自己管理它。在很大程度上减少了编码。
  • 不,它不会引起任何问题。您可以根据自己的需要和使用情况进行操作。
  • 感谢您的回复。我需要在标签栏上再添加一个按钮,该按钮应该可以通过所有屏幕访问。我相信继续使用第一种方法对我来说会更容易。
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多