您的位置:首页 > 产品设计 > UI/UE

随意细解: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];

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: