相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用.

自定义TabBar类 .h

#import <UIKit/UIKit.h>

typedef void(^myBlock) (NSArray *composeButton);//给block起别名,用数组来存放点击的Button

@interface ZSTabBar : UITabBar

@property (nonatomic,strong) myBlock composeButtonBlock;//定义block

@end

.m

#import "ZSTabBar.h"

@interface ZSTabBar ()

@property (nonatomic,strong) UIButton *composeButton;//TabBar中间的撰写按钮

@end
@implementation ZSTabBar -(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame]; [self addSubview:self.composeButton]; return self;
}
//设置TabBar的子控件
-(void)layoutSubviews{
[super layoutSubviews]; CGFloat tabBarW = [UIScreen mainScreen].bounds.size.width / ; int index = ; UIView *tabbar = [[UIView alloc]init]; for (tabbar in self.subviews) {
//如果TabBar子控件类型是UITabBarButton,这里是判断的关键
Class class = NSClassFromString(@"UITabBarButton"); if ([tabbar isKindOfClass:class]) { //给类型属于UITabBarButton设置frame.高一定不能写0
tabbar.frame = CGRectMake(tabBarW * index, , tabBarW, self.bounds.size.height); index ++;
//因为中间的撰写按钮不属于UITabBarButton类,所以要另进行判断
if (index == ) {
index ++;
}
}
} self.composeButton.center = CGPointMake(self.frame.size.width / , self.frame.size.height / );
} #pragma mark -- 对撰写按钮懒加载
-(UIButton *)composeButton{
if (_composeButton == nil) {
_composeButton = [[UIButton alloc]init];
//设置背景图
[_composeButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; [_composeButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
//设置图片
[_composeButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
[_composeButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; [_composeButton sizeToFit]; //点击事件
[_composeButton addTarget:self action:@selector(composeButtonClick:) forControlEvents:UIControlEventTouchUpInside]; }
return _composeButton;
} #pragma mark --撰写按钮的点击事件 -(void)composeButtonClick: (UIButton *)send{
//最好要判断一下block
if (self.composeButtonBlock) {
//将按钮添加到block中
self.composeButtonBlock(@[send]);
}
} @end

标签控制器的.m文件

#import "ZSMainFrameController.h"
#import "ZSHomeViewController.h"
#import "ZSDiscoveryViewController.h"
#import "ZSMessageViewController.h"
#import "ZSMineViewController.h"
#import "ZSTabBar.h"//自定义TabBar
@implementation ZSMainFrameController -(void)viewDidLoad{
[super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; ZSTabBar *tabBar = [[ZSTabBar alloc]init];
//TabBar是ZSTabBar类中私有属性,通过KVC赋值 关键
[self setValue:tabBar forKey:@"tabBar"];
//自定义TabBar的block
tabBar.composeButtonBlock = ^(NSArray *composeButton){
//从数组取出Button
UIButton *compoeButton = composeButton[];
//按钮的点击事件
[self composeButtonClick:compoeButton];
}; ZSHomeViewController *homeVC = [[ZSHomeViewController alloc]init];
[self addChildVC:homeVC title:@"首页" imageName:@"tabbar_home"]; ZSMessageViewController *messageVC = [[ZSMessageViewController alloc]init];
[self addChildVC:messageVC title:@"消息" imageName:@"tabbar_message_center"]; ZSDiscoveryViewController *discoverVC = [[ZSDiscoveryViewController alloc]init];
[self addChildVC:discoverVC title:@"发现" imageName:@"tabbar_discover"]; ZSMineViewController *mineVC = [[ZSMineViewController alloc]init];
[self addChildVC:mineVC title:@"我" imageName:@"tabbar_profile"]; } #pragma mark -- 添加子控制器
-(void)addChildVC:(UIViewController *)childVC title:(NSString *)title imageName:(NSString *)imageName{ childVC.title = title;
//未选中图片
childVC.tabBarItem.image = [UIImage imageNamed:imageName];
//选中图片
NSString *selectedImageName = [NSString stringWithFormat:@"%@_selected",imageName];
childVC.tabBarItem.selectedImage = [UIImage imageNamed:selectedImageName]; UINavigationController *naVC = [[UINavigationController alloc]initWithRootViewController:childVC]; [self addChildViewController:naVC]; } #pragma mark -- 中间撰写按钮的点击事件
-(void)composeButtonClick:(UIButton *)send{
在这里就可以实现撰写按钮的方法
} @end

内容比较简单,希望能给一些新手提供帮助,如果有更好的方法希望大家一起谈论分享.

关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应的更多相关文章

  1. iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

  2. ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

  3. Dynamics CRM 2016/365 窗体中添加按钮

    一.工具下载,及界面介绍 1.下载XrmToolBox工具(XrmToolBox for Microsoft Dynamics CRM/365 CE) 链接:https://www.xrmtoolbo ...

  4. OAF在打开的新页面中添加按钮,功能是关闭当前页面

    OAF在打开的新页面中添加按钮,功能是关闭当前页面 javascript:close()

  5. javafx这些学会后,开发就不难了,往tablecloumn列中添加按钮,修改javafx中tableview中tablecell中的值,修改完回车表示保存到内存中

    javafx开发过程中遇见难题,往tablecloumn列中添加按钮 想了很久的方法,也配有办法判断每行中有数据的地方添加按钮set bank_caozuo.setCellFactory((col)- ...

  6. QTableWidget中添加按钮

    添加按钮 void QTableWidget::setCellWidget ( int row, int column, QWidget * widget ) widget可以是自己定义的按钮 cla ...

  7. MFC中 在SDI模式下的视图中添加按钮的方法

    在单文档视图(SDI)结构中,视图一般用来显示数据.但是,有时也希望在视图中显示按钮或其他的控件,以满足用户的需要.下面是手动添加按钮并使按钮具有响应事件的功能的方法. 第一步:添加一个按钮      ...

  8. [学习笔记] 在Eclipse中添加用户库 Add User Libraries ,在项目中引用用户库

    如果还没有安装Eclipse, 则请参考前文:  [学习笔记] 下载.安装.启动 Eclipse(OEPE) 添加用户库 本文主要介绍在项目中直接使用第三方库的情况.就是把第三方的jar文件直接放到某 ...

  9. Android学习笔记之 SimpleAdapter 中添加按钮响应事件,getView的重写

    Andriod 里面的ListView是一个显示列表数据的控件,常用适配器SimpleAdapter进行绑定,绑定代码如下: ListView lstView = (ListView) this.fi ...

随机推荐

  1. 今天修改 wifi hal 的时候碰见一个问题

    今天修改 supplicant_name的时候出现一个问题. 发现原来init.wifi.rc 的server的时候出现了一个问题. 名字不对,没有和 supplicant_name对应起来. 所以就 ...

  2. android平台编译IW

    不知道怎么编译IW,所以就搜索网络上的博客http://blog.csdn.net/jksl007/article/details/16862435 首先,iw依赖于libnl库,而目前android ...

  3. 扩展方法之ToDictionary()

    Person类: public class Person { public int Id { set; get; } public string WorkNo { set; get; } public ...

  4. 静默方式安装window oracle

    1. setup.exe -silent -responseFile "C:\app\software\WIN64_11204\RSP\db_install_window.rsp" ...

  5. MP3拷贝程序---字节流

    package cn.itcast.p7.io.bytestream.test; import java.io.BufferedInputStream; import java.io.Buffered ...

  6. linux 下载安装tomcat

    1.下载tomcat 2.tar -zxvf apache-tomcat-7.0.67.tar.gz 3.cd bin目录  启动  ./startup.sh [root@fuyuanming bin ...

  7. 在win7 64bit系统安装QC软件

    当本机系统不再QC软件支持的系统上,可以在setup右键选择兼容性选择能支持安装的系统, 在JBOSS页面,选择该服务器,用户名输入本机的用户名和密码,如果没有配置域输入计算机名. 如果没有装IIS, ...

  8. 完整版getByClass2016/4/20

    function getByclass(parent,sclass) { var re=new RegExp('\\b'+sclass+'\\b','i') var aEli=parent.getEl ...

  9. a:link visited hover active

    CSS中a:link.a:visited.a:hover.a:active的用法:建议:尽可能的手写代码,可以有效的提高学习效率和深度.在网页设计中,设计美观的超链接效果可以增强网站的用户体验,可能会 ...

  10. CodeForces 687A NP-Hard Problem(二分图判定)

    这本来一个挺简单的题呢,结果让我给想复杂了,二分图就是把图分成了两部分,然后不同颜色各一边,肯定是满足题目中说的边和点的条件的,真是犯二了.. 代码如下: #include<iostream&g ...