登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [ios/objectc][五星推荐]动态绑定按钮点击事件 objectc 的 @selector 绑定技术风险很高,因为它并不检测函数是否存在.而是在事件发生时直接出错.并且是程序直接崩溃退出!     [回主站]     [分站链接]
标题
[ios/objectc][五星推荐]动态绑定按钮点击事件 objectc 的 @selector 绑定技术风险很高,因为它并不检测函数是否存在.而是在事件发生时直接出错.并且是程序直接崩溃退出!
clq
浏览(319) + 2020-12-24 22:36:20 发表 编辑

关键字:


//动态绑定按钮点击事件
//objectc 的 @selector 绑定技术风险很高,因为它并不检测函数是否存在.而是在事件发生时直接出错.并且是程序直接崩溃退出!
//所以一定要调用此函数绑定!!!
//Target 通常是 self, 应该是指向一个类实例
//void SetButtonOnClick(UIButton * btn, NSString * func_name, id Target)
//这里 NSObject * 和 id 类型居然是一样的
void SetButtonOnClick(UIButton * btn, NSString * func_name, NSObject * Target)
{
//注意 func_name 的写法是 "OnClickTest:" 表示有一个无名参数,如果是 "OnClickTest::" 表示有两个无名参数
//如果是 "OnClickTest::sender" 有名函数呢

//SEL onclick = NSSelectorFromString(@"onclick");
SEL onclick = NSSelectorFromString(func_name);

//据说 SEL 是一个整数. 似乎不同的类如果名称和参数相同,它的 sel 结果值是一样的
//[Functions ShowMessage:IntToStr((int)onclick)];

//另外,可以动态加载类
//id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
//和
//id myObj = [[MySpecialClass alloc] init];
//是一样的。




//NSSelectorFromString 动态加载实例方法。
// SEL sel = NSSelectorFromString(@"yourMethod:")//有参数
// if([object respondsToSelector:sel])
// {
// [object performSelector:sel withObject: @"test" ]; //如果有两个参数,使用两个withObject:参数;
// }



if([Target respondsToSelector: onclick])
{

}else {
ShowMessage(AddString(func_name, @"() 事件函数不存在,无法绑定.", NULL));
return;
}


//给button添加事件,事件有很多种,我会单独开一篇博文介绍它们,下面这个时间的意思是按下按钮,并且手指离开屏幕的时候触发这个事件,跟web中的click事件一样。触发了这个事件以后,执行butClick:这个方法,addTarget:self的意思是说,这个方法在本类中也可以传入其他类的指针
//[btn addTarget:self action:@selector(butClick:) forControlEvents:UIControlEventTouchUpInside];
[btn addTarget:Target action:onclick forControlEvents:UIControlEventTouchUpInside];


}//



//生成一个缺省样式的 uibutton //如果直接 new 是不带有样式的
UIButton * CreateDefaultButton(NSString * caption)
{
UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; //[UIButton new]; 这样出来的没有缺省颜色
//[self.viewMenu addSubview:btn];
//btn.frame = CGRectMake(0, 0, 100, 30);
//btn.backgroundColor = [UIColor redColor];
[btn setTitle:caption forState:UIControlStateNormal];
//[btn setTitleColor: [UIColor lightTextColor] forState:UIControlStateNormal];

//https://blog.csdn.net/u012378167/article/details/51770139 还介绍了一些其他属性

/*
UIButton用法详解


//这里创建一个圆角矩形的按钮
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];


// 能够定义的button类型有以下6种,
// typedef enum {
// UIButtonTypeCustom = 0, 自定义风格
// UIButtonTypeRoundedRect, 圆角矩形
// UIButtonTypeDetailDisclosure, 蓝色小箭头按钮,主要做详细说明用
// UIButtonTypeInfoLight, 亮色感叹号
// UIButtonTypeInfoDark, 暗色感叹号
// UIButtonTypeContactAdd, 十字加号按钮
// } UIButtonType;


//给定button在view上的位置
button1.frame = CGRectMake(20, 20, 280, 40);


//button背景色
button1.backgroundColor = [UIColor clearColor];


//设置button填充图片
//[button1 setImage:[UIImage imageNamed:@"btng.png"] forState:UIControlStateNormal];


//设置button标题
[button1 setTitle:@"点击" forState:UIControlStateNormal];


forState: 这个参数的作用是定义按钮的文字或图片在何种状态下才会显现
//以下是几种状态
// enum {
// UIControlStateNormal = 0, 常规状态显现
// UIControlStateHighlighted = 1 << 0, 高亮状态显现
// UIControlStateDisabled = 1 << 1, 禁用的状态才会显现
// UIControlStateSelected = 1 << 2, 选中状态
// UIControlStateApplication = 0x00FF0000, 当应用程序标志时
// UIControlStateReserved = 0xFF000000 为内部框架预留,可以不管他
// };


//默认情况下,当按钮高亮的情况下,图像的颜色会被画深一点,如果这下面的这个属性设置为no,那么可以去掉这个功能
button1.adjustsImageWhenHighlighted = NO;


//跟上面的情况一样,默认情况下,当按钮禁用的时候,图像会被画得深一点,设置NO可以取消设置
button1.adjustsImageWhenDisabled = NO;
//下面的这个属性设置为yes的状态下,按钮按下会发光
button1.showsTouchWhenHighlighted = YES;


//给button添加事件,事件有很多种,我会单独开一篇博文介绍它们,下面这个时间的意思是按下按钮,并且手指离开屏幕的时候触发这个事件,跟web中的click事件一样。触发了这个事件以后,执行butClick:这个方法,addTarget:self的意思是说,这个方法在本类中也可以传入其他类的指针
[button1 addTarget:self action:@selector(butClick:) forControlEvents:UIControlEventTouchUpInside];


//显示控件
[self.view addSubview:button1];


注:
[button1 addTarget:self action:@selector(alarmTimeDone:) forControlEvents:UIControlEventTouchUpInside
];


addTarget:self 是链接到self,一般都这样设置
action:@selector(alarmTimeDone:) 时间处理函数
forControlEvents:UIControlEventTouchUpInside 控件事件处理的消息


//取消按钮已经添加的所有事件:(这个比较重要,若添加了两个事件 两个事件都会被触发)
[btn removeTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];


何时释放release UIButton?
是否在dealloc中对UIButton对象进行release操作,取决于UIButton初始化的方式。
如果使用[UIButtonbuttonWithType:UIButtonTypeRoundedRect]这种方式,是不需要进行release操作的,因为这种方式是自动释放的。如果使用 [[UIButton alloc]init]的方式,则需要主动进行release释放操作。


*/


return btn;
}//


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1