单击 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 为您管理。如果您有进一步的疑问,请告诉我。
我创建了一个带有 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 为您管理。如果您有进一步的疑问,请告诉我。