iOS控件之UITabBarController(分栏控制器)

这段代码写在#import  "AppDelegate.m"里面
为了体现分栏,以下我创建了三个视图控制器

#import "AppDelegate.h"
#import "VCFirst.h"
#import "VCSecond.h"
#import "VCThird.h"
#import "rootViewController.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	//创建window
	self.window=[ [UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
	//self.window.rootViewController = [[rootViewController alloc] init];
	//self.window.backgroundColor = [UIColor whiteColor];
	//显示window
	[self.window makeKeyAndVisible];
	//创建控制器一
	VCFirst* vcFirst = [[VCFirst alloc] init];
	//创建控制器二
	VCSecond* vcSecond = [[VCSecond alloc] init];
	//黄色背景
	vc.Second.view.backgroundColor = [UIColor yellowColor];
	//创建控制器三
	VCThird* vcThird = [[VCThird alloc] init];
	//橙色背景
	vcThird.view.backgroundColor = [UIColor orangeColor];
	
	vcFirst.title = @"视图1";
	vcSecond.title = @"视图2";
	vcThird.title = @"视图3";

	//蓝色背景
	//这里一定要注意,使用点语法会访问viewDidLoad.
	//注意颜色失效问题
	vcFirst.view.backgroundColor = [UIColor blueColor];

	//创建分栏控制器对象
	UITabBarController* tbController = [[UITabBarController alloc] init];
	//创建一个控制器数组对象
	//将所有要被分栏控制器管理的对象添加到数组中
	NSArray* arrayVC = [NSArray arrayWithObjects:vcFirst,vcSecond,vcThird, nil];

	//将分栏视图控制器管理数组赋值
	tbController.viewControllers = arrayVC;

	//将分栏控制器作为根视图控制器
	self.window.rootViewController = tbController;

	//设置选中的视图控制器的索引
	//通过索引来确定显示哪一个控制器
	tbController.selectedIndex = 2;

	//当前选中的控制器对象
	if (tbController.selectedViewController == vcThird) {
		NSLog(@"当前显示的是控制器三~");
	}
	
	//设置分栏控制器的工具栏的透明度
	tbController.tabBar.translucent = NO;
	
	//改变工具栏颜色
	tbController.tabBar.barTintColor = [UIColor redColor];
	//更改按钮风格颜色
	tbController.tabBar.tintColor = [UIColor blackColor];
	return YES;
}

接下来就是完成各个视图控制器啦。先来看VCFirst

- (void)viewDidLoad {
	[super viewDidLoad];

	//创建一个分栏按钮对象
	//参数一:文字
	//P2:显示图片图标
	//P3:设置按钮的tag值
	//方法一:
//	UITabBarItem* tabBarItem = [[UITabBarItem alloc] initWithTitle:@"111" image:nil tag:101];
// self.tabBarItem = tabBarItem;

	//根据系统风格创建分栏按钮
	//P1:系统风格设定
	UITabBarItem* tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:101];
	
	//按钮右上角的提示信息
	//通常用来提示未读的信息
	tabBarItem.badgeValue = @"99";

	self.tabBarItem = tabBarItem;
}

道理都是一样的,vcSecond vcThird就不多赘述了

//个人总结:在设置各个元素项的背景颜色时,要注意语句的先后允许顺序。否则可能会导致设置失效。

接下来看几个UITabBarController(分栏控制器)协议函数
既然是协议函数,肯定要先设置代理啦
在AppDelegate.h里面

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

然后

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	//这里面要多一条语句
	tbController.delegate = self;
}

现在就可以开始写协议函数了

//开始编辑前调用
-(void) tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(nonnull NSArray<__kindof UIViewController *> *)viewControllers {
    
    NSLog(@"编辑器前");
}
-(void) tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed {
    
    NSLog(@"即将结束前!");
}
-(void) tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed {
    
    NSLog(@"vcs = %@",viewControllers);
    if (changed == YES) {
        NSLog(@"顺序发生改变!");
    }
    NSLog(@"已经结束编辑!");
}

// 要注意有这个方法时,点击more会报错。因为它传入的参数是一个视图控制器。
-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    
    if (tabBarController.viewControllers[tabBarController.selectedIndex] == viewController) {
        NSLog(@"OK!");
    }
    NSLog(@"选中控制器对象");
}

个人总结:
OC中的方法名大多很长,因此我们平时练习时要注意它的名字,最后能理解它的意思,特别是传入的参数。