UI一揽子计划 13 (UITabBarController 、UITabBar、UITabBarItem  、Block传值)

本文详细介绍如何使用UITabBarController创建带有多个视图控制器的标签栏界面,并通过实例代码展示了如何配置各个视图控制器及其对应的导航栏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



一.UITabBarController
.m
#import "RootTabBarViewController.h"
#import "OneViewController.h"
#import
"TwoViewController.h"
#import
"ThreeViewController.h"
#import
"FourViewController.h"
#import
"FiveViewController.h"
#import
"SixViewController.h"

@interface RootTabBarViewController ()<UITabBarControllerDelegate>

@end

@implementation RootTabBarViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
   
//[self addViewController];
    [
self addChildViewController];
   
   
// Do any additional setup after loading the view.
}

// 添加控制器

- (
void)addViewController
{
   
// 创建一个OneViewController 对象
   
OneViewController *oneVC = [[OneViewController alloc]init];
   
// 添加导航控制器
   
UINavigationController *oneNavC = [[UINavigationController alloc]initWithRootViewController:oneVC];
   
   
// 添加tabBar 的图片  tabBar  高度为44 最大是30 x 30 ,因为下面还有标题
    oneNavC.
tabBarItem.image = [[UIImage imageNamed:@"1"] imageWithRenderingMode:(UIImageRenderingModeAutomatic)];
   
/*
    
这个方法的使用是图片的
     UIImageRenderingModeAutomatic,          //
默认的
     UIImageRenderingModeAlwaysOriginal,     //
真实图片的颜色
     UIImageRenderingModeAlwaysTemplate,     //
只显示图片的轮廓
     */

   
//oneNavC.tabBarItem.selectedImage = [UIImage imageNamed:@"2"];
    oneNavC.
tabBarItem.title = @"首页";
   
// 添加第二个控制器
   
TwoViewController *twoVC = [[TwoViewController alloc]init];
   
UINavigationController *twoNavC = [[UINavigationController alloc]initWithRootViewController:twoVC];
    twoNavC.
tabBarItem.image = [UIImage imageNamed:@"20-gear2"];
  
// twoNavC.tabBarItem.selectedImage = [UIImage imageNamed:@"3"];
    twoNavC.
tabBarItem.title = @"设置";
   
   
// 添加消息数量  这个属性  是字符串类型的
    twoNavC.
tabBarItem.badgeValue = @"99+";
   
   
   
ThreeViewController *threeVC = [[ThreeViewController alloc]init];
   
UINavigationController *threeNavC = [[UINavigationController alloc]initWithRootViewController:threeVC];
    threeNavC.
tabBarItem.image = [UIImage imageNamed:@"75-phone"];
    threeNavC.
tabBarItem.title = @"电话";

   
   
FourViewController *fourVC =[[FourViewController alloc]init];
   
UINavigationController *fourNavC = [[UINavigationController alloc]initWithRootViewController:fourVC];
    fourNavC.
tabBarItem.image = [UIImage imageNamed:@"80-shopping-cart"];
    fourNavC.
tabBarItem.title = @"购物车";
   
   
FiveViewController *fiveVC =[[FiveViewController alloc]init];
   
UINavigationController *fiveNavC = [[UINavigationController alloc]initWithRootViewController:fiveVC];
    fiveNavC.
tabBarItem.image = [UIImage imageNamed:@"71-compass"];
    fiveNavC.
tabBarItem.title = @"地图";
   
   
SixViewController *sixVC = [[SixViewController alloc]init];
   
UINavigationController *sixNavC =[[UINavigationController alloc]initWithRootViewController:sixVC];
    sixNavC.
tabBarItem.image = [UIImage imageNamed:@"106-sliders"];
    sixNavC.
tabBarItem.title = @"调节";
   
   
// 添加到UITabBarViewController 的数组里  // 被管理
   
self.viewControllers = @[oneNavC,twoNavC,threeNavC,fourNavC,fiveNavC];
   
// 多少都能显示 但是一般最多只显示五个  其他的都在"More"里面
   
   
   
// 默认选中第几个
   
self.selectedIndex = 1;
   
    [oneVC
release];
    [oneNavC
release];
    [twoVC
release];
    [twoNavC
release];
    [threeVC
release];
    [threeNavC
release];
    [fourVC
release];
    [fourNavC
release];
    [fiveVC
release];
    [fiveNavC
release];
    [sixVC
release];
    [sixNavC
release];
   
   
   
}

// 封装一下

- (
void)addViewControllerClass:(Class)class title:(NSString *)title image:(NSString *)image selectImage:(NSString *)selectImage
{
   
// 创建一个UIViewController
   
UIViewController *viewVC = [[class alloc] init];
   
   
// 创建导航控制器
   
   
UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:viewVC];
   
   
// 设置标题 图片 点击图片
   
    navC.
tabBarItem.title = title;
    navC.
tabBarItem.image = [UIImage imageNamed:image];
    navC.
tabBarItem.selectedImage = [UIImage imageNamed:selectImage];
   
   
// 添加到数组里面  相当于添加到ViewController里面
    [
self addChildViewController:navC];
   
    [viewVC
release];
    [navC
release];
}


// 使用封装的方法添加控制器
- (
void)addChildViewController
{
    [
self addViewControllerClass:[OneViewController class] title:@"首页" image:@"1" selectImage:@"1"];
    [
self addViewControllerClass:[TwoViewController class] title:@"设置" image:@"20-gear2" selectImage:@"20-gear2"];
    [
self addViewControllerClass:[ThreeViewController class] title:@"电话" image:@"75-phone" selectImage:@"75-phone"];
    [
self addViewControllerClass:[FourViewController class] title:@"购物车" image:@"80-shopping-cart" selectImage:@"80-shopping-cart"];
    [
self addViewControllerClass:[FiveViewController class] title:@"地图" image:@"71-compass" selectImage:@"71-compass"];
    [
self addViewControllerClass:[SixViewController class] title:@"调节" image:@"106-sliders" selectImage:@"106-sliders"];
   
   
   
// 设置bar 的颜色 和图片
   
   
self.tabBar.barTintColor = [UIColor redColor];
    [
self.tabBar setBackgroundImage:[UIImage imageNamed:@"tabBar"]];
   
   
// 设置代理
   
self.delegate = self;
   
}
#pragma mark - tabBarController 代理方法

- (
void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
// 获取点击的 下标做点事 例如刷新界面
    NSLog(@"%ld", tabBarController.selectedIndex);
}


//======================

// Block 传值的步骤
/**
 *  1.
定义一个Block 并且 要传的值作为Block的参数
    2.
把起好名的Block 写成属性 copy声明
    3.
释放Block属性 使用Block_release方法
    4.
在要传值的位置 调用Block
    5.
在要接收传值的位置 实现Block
    6.
注意实现中使用self _ _ Block修饰
 */

// 定义一个 无返回值 偶一个字符串参数的Block
typedef void(^WLBlock)(NSString *);
@interface RootViewController : UIViewController
// 定义一个Block属性

@property (nonatomic,copy)WLBlock wlBlock;

@end
- (void)dealloc
{
   
Block_release(_wlBlock);    // 属性应该释放掉
    [
super dealloc];
}
- (
void)viewDidLoad {
    [
super viewDidLoad];
   
// Do any additional setup after loading the view.
}

- (
void)didReceiveMemoryWarning {
    [
super didReceiveMemoryWarning];
   
// Dispose of any resources that can be recreated.
}
#pragma mark -- 前情提要
/*
 
 //
属性语义控制copy的内部实现
 - (void)setName:(NSString *)name
 {
 if (_name != name) {
 [_name release];
 _name = [name copy];
 }
 }
 - (NSString *)name
 {
 return _name;
 }
 */

#pragma mark -- 内部实现  没啥大用

- (
void)setWlBlock:(WLBlock)wlBlock   // 将栈区的Block 拷贝到了堆区
{
   
if (_wlBlock != wlBlock) {
       
Block_release(_wlBlock);    // 释放Block
       
_wlBlock = Block_copy(wlBlock);   // 拷贝Block
    }
}
- (void)dealloc
{
   
Block_release(_jjBlock);
    [
super dealloc];
}

- (
void)viewDidLoad {
    [
super viewDidLoad];
   
self.view.backgroundColor = [UIColor whiteColor];
   
   
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc]initWithTitle:@"传值" style:(UIBarButtonItemStylePlain) target:self action:@selector(rightButton:)];
   
self.navigationItem.rightBarButtonItem = rightButton;
    [rightButton
release];
   
   
TouchView *touchView = [[TouchView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    touchView.
backgroundColor = [UIColor redColor];
    [
self.view addSubview:touchView];
    [touchView
release];
   
      
// Block 的实现
   
// Block 出现的问题 循环引用的问题
   
// 为了解决这个问题 需要用_ _ B l o c k来修饰一下
   
// 如果要在Block里面的实现里面使用self的话,就必须用 __Block修饰下
   
   
   
// 如果在ARC下面  需要用__Week 来修饰
   
__block SecondViewController *mySelf = self;

    touchView.
wlBlock = ^void(NSString *str){
       
NSLog(@"%@", str);
        [mySelf.
navigationController popViewControllerAnimated:YES];
    };
   
// Block的主要用途 传值  从后往前传
   
   
// Do any additional setup after loading the view.
}


- (
void)right:(UIBarButtonItem *)button
{
   
SecondViewController *secVC = [[SecondViewController alloc]init];
    [
self.navigationController pushViewController:secVC animated:YES];
   
   
__block RootViewController *mySelf = self;
   
// 实现Block 并且接受参数
    secVC.
jjBlock = ^void(NSString *str){
        mySelf.
navigationItem.title = str;

    };
    [secVC
release];
}



- (
void)rightButton:(UIBarButtonItem *)button
{
   
   
// 调用 (在要传值的位置调用Block)
   
_jjBlock(@"传值");
    [
self.navigationController popViewControllerAnimated:YES];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值