UITabBarController
标签视图控制器
常用属性
显示的视图控制器(需要添加到viewControllers的数组中)
self.viewControllers = @[oneNav, twoNav, threeNav, fourNav, fiveNav, sixNav];
标签栏 – tabBar
// 设置tabBar的颜色 self.tabBar.barTintColor = [UIColor whiteColor]; self.tabBar.tintColor = [UIColor blackColor]; // tabBar的高度 : 49 self.tabBar.backgroundImage = [UIImage imageNamed:@"tabBar"];
设置默认选中的页面
self.selectedIndex = 2; //(默认为0)
tabBarItem上的红色提示按钮
twoVC.tabBarItem.badgeValue = @"2";
代理方法
首先要设置代理
可以指定哪个控制器不让点击
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { // 取出不让点击的控制器 UINavigationController *nav = self.viewControllers[3]; // 如果选中的控制器是你不想让用户点击的 // 那么返回NO if (viewController == nav) { return NO; }else{ return YES; } }
选中页面时触发的方法
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { // 打印选中的索引 NSLog(@"%ld",self.selectedIndex); }
控制more的代理方法
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers { NSLog(@"将要开始编辑more"); } - (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { NSLog(@"将要结束编辑more"); } - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { NSLog(@"已经结束编辑more"); }
block高级
block是匿名函数,能够实现函数的回调功能。用于页面之间通信,同时可以进行传值。
注意:定义属性接收block时,必须使用copy修饰。block释放时,使用Block_Release()
回调传值
举例:在secondViewController中点击右上角的传值按钮,将rootViewController中的导航视图控制器的标题改为“传值”
在secondViewController.h中声明一个block,并设为属性
// 无返回值 typedef void(^PassValue)(NSString *str); // 申明属性 @property (nonatomic, copy) PassValue passValueBlock;
在secondViewController的点击按钮事件的方法中调用block
// 点击按钮传值 - (void)BarButtobItemClick:(UIBarButtonItem *)buttonItem { self.passValueBlock(@"传值"); }
在rootViewController中写实现block的部分(接收传过来的值,一般找哪里有SecondViewController)
// 实现block 接收传过来的值 secondVC.passValueBlock = ^void(NSString *str){ self.navigationItem.title = str; [self.navigationController popToRootViewControllerAnimated:YES]; };
运行结果
能实现结果,但是block和ViewController都不能释放。这里存在循环引用的问题。
问题原因:在block块时,引用计数加1
解决方法:加上 __block修饰。因为它有一个引用计数减1的操作
代码修改:
修改实现block的部分的代码,用__block修饰一下self
__block SecondViewController *mySelf = self;
// 写block的实现
touchView.block = ^ void(){
NSLog(@"我来到了secondVc中");
[mySelf.navigationController popToRootViewControllerAnimated:YES];
};