随意细解:UI -- 标签视图控制器
2015-11-28 19:55
357 查看
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]; };
相关文章推荐
- HDU 1005 Number Sequence(坑 T_T !!!)
- iOS 8新特性—— UIAlertController
- Building Simulation Packet-Loss System in Channel
- 我的iOS学习历程 - UITabBarViewController
- 为什么Java中1000==1000为false而100==100为true?
- UESTC 65 CD Making 贪心法
- UI-之plist文件解析
- 【Leetcode】N-Queens II
- UINavigationController设置导航栏属性
- 【Leetcode】N-Queens
- UITabBarController
- Codeforces 288E Polo the Penguin and Lucky Numbers
- UITableView 的结构
- 使用druid连接池的超时回收机制排查连接泄露问题
- 在Legacy BIOS与UEFI 两种模式安装Windows 8操作系统的方法
- iOS 9人机界面指南:UI设计基础--模态情景(Modal Contexts)
- HDFS Short-Circuit Local Reads
- iOS流布局UICollectionView系列一——初识与简单使用UICollectionView
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备四)
- easyui datagrid 表格组件列属性formatter和styler使用方法