UI day 12 UITabBarController 标签视图控制器 微信的界面 Block 传值_张乾坤的博客-程序员秘密

技术标签: UI  UI基础  

                UITabBarController 标签视图控制器
1.UITabBarController继承自UIViewController本身自带一个视图,这个视图上有两个控件contentview和tabBar,是用来管理多个单视图控制器的多个视图控制器,它管理多个单视图控制器之间是并列的关系,同时存在,但是相互之间没有太大的关联
2.UITabBarController管理的标签超过五个的时候,会自动生成more按钮,more按钮对应的视图控制器是导航视图控制器,多出来的视图都被这个导航控制器管理

3.UITabBarController管理的视图控制器对象自带的View只有当它第一次出现的时候会创建,以后就不在创建了,所有标签视图控制器管理的视图控制器之间是并列存在的
属性
配置标签栏的标题
firstVC.tabBarItem.title = @"firstVC";
配置标签栏的图片
firstVC.tabBarItem.image = [UIImage imageNamed:@"01-refresh"];
配置右上角的角标
firstVC.tabBarItem.badgeValue = @"99+";
4.
1.创建对象
UITabBarController *tbContoller = [[UITabBarController alloc]init];
2.准备一个数组存放视图控制器
 NSArray *controllers = @[firstVC,secondVC,thirdVC,forthVC,fifthVC,sixVC];
3.配置所管理的多个单视图控制器
 tbContoller.viewControllers = controllers;
4.配置标签栏的颜色
 tbContoller.tabBar.barTintColor = [UIColor purpleColor];
5.配置内容的渲染颜色
 tbContoller.tabBar.tintColor = [UIColor cyanColor];
6.配置标签栏的图片 标签栏的高度49
 tbContoller.tabBar.backgroundImage = [UIImage imageNamed:@"1"];
7.配置默认选中的标签有两种方法
   方法一  根据下标选择
    tbContoller.selectedIndex =2;
        方法二   根据视图控制器选择
   tbContoller.selectedViewController = forthVC;
8.配置代理属性
  tbContoller.delegate = self;
9.将标签视图控制器指定为window的根视图控制器
   
self.window.rootViewController = tbContoller;
    [tbContoller
release];

#pragma mark 代理方法
//1.当切换标签的时候出发,询问当前的标签是否可以选中
- (
BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0){
//    viewController指的是将要选中的视图
//    tabBarController指的是当前的代理委托者
//    if(viewController.tabBarItem.tag == 101){
//        return NO;
//}
return YES;
   
}

//2.触发时机标签选中的时候会触发
- (
void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
//    将选中标签的角标去除,选择哪一个去除哪一个
    viewController.
tabBarItem.badgeValue = nil;
   
}

#########总结#############
/使用UItabBarController管理的视图之间的切换,走的哪些方法
//A-->BB将要出现---A将要消失---A已经消失---B已经出现
//B---AA将要出现---B将要消失--B已经消失---A已经出现

                            微信界面的实现
- (void)viewDidLoad {
    [
super viewDidLoad];
   
self.view.backgroundColor = [UIColor grayColor];
    [
self configureViewController];
//    修改所有导航条的颜色  类似于一键换肤
    [[
UINavigationBar appearance] setBarTintColor:[UIColor lightGrayColor]];
//    修改所有标签栏的颜色
    [[UITabBar appearance ] setBarTintColor :[ UIColor lightGrayColor ]];
//修改所有标签栏的内容渲染颜色
[[UITabBar appearance] setTintColor:[UIColor orangeColor]];

}

1. 消息界面
   
ChatViewController *chatVC = [[ChatViewController alloc]init];
   
UINavigationController *chatNC = [[UINavigationController alloc]initWithRootViewController:chatVC];
//    chatVC.tabBarIrem 可以获取到离他最近的标签栏
//    chatVC.navigationItem 获取到离他最近的导航条
//    chatVC.tabBarItem.title = @"微信";
    chatVC.
tabBarItem.image = [UIImage imageNamed:@"[email protected]"];
//    chatVC.navigationItem.title = @"微信";
    chatVC.
title = @"微信";//可以同时设置离他最近的导航条和标签栏的标题
//    chatVC.navigationController.navigationBar.barTintColor = [UIColor grayColor];


//自定义的视图控制器方法
- (
void)configureViewController
{
通讯录
   
ContactViewController *contactVC = [[ContactViewController alloc]init];
   
UINavigationController *contactNC = [[UINavigationController alloc]initWithRootViewController:contactVC];
    contactVC.
title =@"通讯录";
    contactVC.
tabBarItem.image = [UIImage imageNamed:@"[email protected]"];
   

 发现
   
FindViewController *findVC = [[FindViewController alloc]init];
   
UINavigationController *findNC = [[UINavigationController alloc]initWithRootViewController:findVC];
    findVC.
title = @"发现";
    findVC.tabBarItem.image = [UIImage imageNamed:@"[email protected]"];

我的
   
MineViewController *mineVC = [[MineViewController alloc]init];
   
UINavigationController *mineNC = [[UINavigationController alloc]initWithRootViewController:mineVC];
    mineVC.
title = @"";
    mineVC.
tabBarItem.image = [UIImage imageNamed:@"[email protected]"];
//    self.tabBar.barTintColor = [UIColor lightGrayColor];

配置标签视图控制器管理视图的数组
   
NSArray *viewControllers = @[chatNC,contactNC,findNC,mineNC];
    [chatNC
release];
    [chatVC
release];
    [contactNC
release];
    [contactVC
release];
    [findNC
release];
    [findVC
release];
    [mineNC
release];
    [mineVC
release];
//    给标签视图控制器的ViewController数组赋值
    self.viewControllers = viewControllers;

}

2.chatViewContr.m中写
#########################################################################
1.访问到当前管理该视图控制器的导航控制器(最近的)####
   
self.navigationController;
//    2.访问到当前管理该视图控制器的标签视图控制器(最近的)####
   
self.tabBarController;
//    3.访问到当前管理该视图控制器的导航控制器所管理的所有视图控制器
   
self.navigationController.viewControllers;
//    4.访问到当前管理该视图控制器的标签视图控制器所管理的所有的视图控制器
   
self.tabBarController.viewControllers;
   
//    注册cell
    [
self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kTabelViewCell];


//点击cell会走的方法
- (
void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//    创建UItableViewController子类时可以指定自带的tableView的格式是plain还是group样式的
   
DetailViewController *detailVC = [[DetailViewController alloc]initWithStyle:(UITableViewStyleGrouped)];
//    跳转时是否隐藏标签栏
   
self.hidesBottomBarWhenPushed = YES;
    [
self.navigationController pushViewController:detailVC animated:YES];
   
self.hidesBottomBarWhenPushed = NO;
    [detailVC
release];
   
}

                   Block 传值   
FirstViewController 和  SecondViewController  继承UIViewController

#warning Block 传值
#warning 第一步    
定义给block的类型起别名   在secondVC.h中写
typedef  void (^passBlock)(NSString *);

#warning 第二步     定义 block 类型的变量    在secondVC.h中写
block变量存在于栈区,用copy修饰后就会存放在堆区,从而保证block块不会丢失,申请了内存就要释放内存
@property(nonatomic,copy)passBlock passValue;


- (void)handlePush:(UIButton *)button
{
    SecondViewController *secondVC = [[SecondViewController alloc]init];
#warning 第三步    push 之前给 block 赋值   在firstVC.m中写
    __block typeof(self) weakSelf = self;
    secondVC.
passValue = ^(NSString *string)
    {       block 块内给控件赋值
        weakSelf.textField.text = string;
    };

 [ self . navigationController pushViewController :secondVC animated : YES ];
 [secondVC release ];
}


- (void)handlePop:(UIButton *)pop
{
   
self.testBlock();//block的调用
#warning 第四步    pop之前调用block块 在secondVC.m中写
    self.passValue(self.textField.text);
   
    [
self.navigationController popViewControllerAnimated:YES];
}





















































版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangyu20101025/article/details/50374478

智能推荐

基于STM32的角度跟随云台_stm32云台相机_不用加油也没有关系哦的博客-程序员秘密

硬件:STM32F103SG90MPU6050OLED具体程序和云台效果:https://www.bilibili.com/video/BV1S7411m7eu/

开源 Swift AutoLayout 框架 SnapKit 介绍_18790970257的博客-程序员秘密

自从水果发布了5代,苹果为了适配多种屏幕尺寸,搞出了一个所谓的AutoLayout来解决问题,iOS程序员们从此走上了苦逼的适配路。“适配”本身其实并不是一个头疼的事情,对于4-6寸的手机来说,只要制定一套规则,就不会有太大的问题。但是令我痛苦的部分在于——iOS的 Constraints 和 VFL。痛苦的NSLayoutConstraints这里借用iOS开源项目 Masonry ...

黑马程序员_Java基本数据类型对象包装类_weixin_30532973的博客-程序员秘密

基本数据类型对象包装类byte  Byteshort  Shortint  Integerlong  Longboolean  Booleanfloat  Floatdouble  Doublechar  Character基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串之间坐转换。基本数据类型转成字符串  基本数据类型+"" ...

Pytorch版本yolov3源码阅读[4]_行*云的博客-程序员秘密

datasets.pyimport globimport mathimport osimport randomimport shutilfrom pathlib import Pathimport cv2import numpy as npimport torchfrom torch.utils.data import Datasetfrom tqdm import t...

网络游戏外挂制作技术浅谈_feijj2002_的博客-程序员秘密

   外挂无非分以下几种(依制作难度):1、动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标、键盘等,使游戏里的人物进行流动或者攻击,最早以前的“石器”外挂就是这种方式2、本地修改式,这种外挂跟传统上的一些游戏修改器没有两样,做这种外挂在编程只需要对内存地址有一点认识并且掌握API就可以实现,它的难点在于找到那些地址码,找地址一般地要借助于别人的工具,有的游戏还有双码校验,正正找起来

2021-06-04学习HTML第八天_努力的可达鸭的博客-程序员秘密

HTML一级目录二级目录三级目录一级标题二级标题三级标题四级标题五级标题六级标题一级目录二级目录三级目录一级标题二级标题三级标题四级标题五级标题六级标题

随便推点

audio读取文件流播放音频_audio文件流_菜鸟进军大神陆的博客-程序员秘密

jsp阶段:<audio controls="controls" controlsList="nodownload"><source src="${ctx }/phone/getAudio.ce?type=3&PATHID='+mp+'" type="audio/mpeg"></audio>效果图:java部分:@Request

支付漏洞总结 / 在线支付流程安全分析_我是如何1元再购特斯拉的是什么漏洞_Omni-Space的博客-程序员秘密

前言大家对支付漏洞的理解通常都是篡改价格,已有的对支付漏洞的总结也是对现有的一些案例的经验式归类,没有上升到对在线支付流程深入分析的一个层面。这里尝试从分析在线支付流程,在线支付厂商的接入方式开始,深入业务分析整个在线交易流程中容易出现的安全问题。支付宝/在线支付流程支付宝即时到账接口开发流程在线支付从功能上来说是通过支付宝的支付渠道,付款者直接汇款给另一个拥有支付宝账号的收款者。

OAuth2.0免登陆授权_oauth2 免密登录_我们坚决不光头的博客-程序员秘密

单体应用:session+cookie方式实现权限管理分布式环境:多个Tomcat,Nginx做负载均衡,无法实现session共享ip轮询(session黏贴):每次请求,固定机制,都分发到第一台服务器,存储session的服务器一旦挂掉,其他服务器无法使用。session复制:各个节点都复制session,但是session比较重,一旦请求早于复制过程,就会出现登录异常问题。session集中存储:使用三方的redis。基于无状态token方式:token保存用户所有信息,返回到客户

Maven项目读取resources下文件_波波仔86的博客-程序员秘密

网上有问答如下:问:  new FileInputStream("src/main/resources/all.properties")  new FileInputStream("./src/main/resources/all.properties")  上面两个无法读取maven下资源文件目录下的文件嘛,总是提示找不到该路径,这么写错了嘛,但是我的其他maven可以读取答:  ...

令牌桶算法(自定义注解)AOP实现服务限流_令牌桶是aop的实现嘛_风起尘落的博客-程序员秘密

1.引入限流算法--令牌桶 和AOP依赖 <!--引入aop依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop&...

推荐文章

热门文章

相关标签