做项目封装UIView的时候碰到的问题,没想到有个哥们儿还写成博客,特此收藏!

问题是这样的,几个界面用到同一个自定义返回按钮,于是就想着把这个按钮单独封装起来,添加一个UIView类,在里面自定义UIButton,使用delegate来实现点击事件

//UIView类头文件XZXTopView.h

#import <UIKit/UIKit.h>

@protocol BtnDelegate <NSObject>  //定义一个delegate

- (void)dismissViewController;    //声明一个delegate方法

@end

@interface XZXTopView : UIView{

id <BtnDelegate> delegate;        //声明delegate变量

}

@property (nonatomic, strong) id <BtnDelegate> delegate;   //声明delegate属性

@end

//UIView类XZXTopView.m

#import "XZXTopView.h"

@implementation XZXTopView

@synthesize delegate;

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

// Initialization code

    //自定义一个UIButton

UIButton *button=[UIButtonbuttonWithType:UIButtonTypeCustom];

UIImage *image = [UIImage imageNamed:@"b_back"];

[button setImage:image forState:UIControlStateNormal];

[button setFrame:CGRectMake(5., 7., image.size.width, image.size.height)];

[button addTarget:selfaction:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:button];

}

return self;

}

- (void)buttonClicked:(UIButton *)sender{

[delegate dismissViewController];  //点击按钮执行此delegate方法

}

//UIViewController类头文件XZXHelpViewController.h

#import <UIKit/UIKit.h>

#import "XZXTopView.h"

@interface XZXHelpViewController : UIViewController<BtnDelegate>  //这里

@end

//UIViewController类 XZXHelpViewController.m文件

#import "XZXHelpViewController.h"

@interfaceXZXHelpViewController ()

@end

@implementation XZXHelpViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

// Custom initialization

}

returnself;

}

- (void)viewDidLoad

{

[superviewDidLoad];

// Do any additional setup after loading the view from its nib.

XZXTopView *topView = [[XZXTopView alloc] init];   //错误的初始化

topView.delegate = self;    //定义XZXTopView的时候指定其代理为自身

[self.view addSubview:topView];

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

//点击button后的具体执行方法

- (void)dismissViewController

{

[selfdismissViewControllerAnimated:YES completion:NULL];

}

@end

代理简单的用法就是这样

上述代码编译执行后,按钮正常显示,但点击没有反应,这是为什么呢?

受惯性思维影响,认为既然能显示,就点击的到,实际上按钮并没有被真正点击到,那是因为我们并没有设置UIButton的上一层UIView类的frame,即

XZXTopView *topView = [[XZXTopView alloc] init]; 这样的初始化是错误的

这样初始化后topView的frame是默认的(0.0,0.0,0.0,0.0);使得button并没有被点击到

正确的初始化方法:

XZXTopView *topView = [[XZXTopView alloc] initWithFrame:CGRectMake(0.0,0.0,320,50)]; //frame自己设置,比button大就可以了

或者在XZXTopView里把自身的frame也可以

转自:http://www.haogongju.net/art/2043183

iOS开发

关于UIButton嵌入到UIView点击无反应问题的解决方法和delegate的简单用法示例(转载)的更多相关文章

  1. Windows 7 任务栏图标消失(变透明,仍然占有地方,但是点击无反应)的解决方法

    解决方案:清理资源管理器缓存(重启资源管理器) 1.打开程序管理器(ctrl+shift+esc) 2.在进程那里找到"explorer.exe",然后按结束进程 3.然后在文件( ...

  2. wordpress模块无法拖拽/显示选项点击无反应

    问题:wordpress模块无法拖拽/显示选项点击无反应,还有编辑器的全屏什么的都用不了,按F12查看了console,提示很多jQuery is not defined... 解决方法:把wp-in ...

  3. UIButton防止被重复点击

    一.避免屏幕内多个 UIButton 被重复点击 1.在 AppDelegate 中添加[[UIButton appearance] setExclusiveTouch:YES]; 2.button. ...

  4. Android ListView的item背景色设置以及item点击无响应等相关问题

    Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的ite ...

  5. wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法

    原文链接:wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法 最近升级wordpress之后,发现在文章编辑界面的添加新媒体和可视化按钮点击无反应,如下:  然后就在网上找解决办法, ...

  6. Android ListView item 点击事件失效问题的解决

    关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...

  7. 如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可

    如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某几个角(小于4)为圆角而别的不变时 ...

  8. MyEclipse 点击 部署 按钮 无效的解决办法

    问题描述 1 通常情况下,当我们点击MyEclipse任务栏上的部署按钮时,会弹出项目部署框,如下图:   2 但我们有时也会遇到点击部署按钮怎么也弹不出项目部署框的问题. END 解决方法一: 1 ...

  9. idea中文输入法无提示问题的解决

    中文输入法无提示问题的解决 双击Shift键打开Search Everywhere,输入Switch Boot JDK,选择 Switch IDE boot JDK...菜单,然后点击...设置Ora ...

随机推荐

  1. sqlserver2008客户端设置主键自增

    是标识改为是

  2. chroot: failed to run command `/bin/bash': No such file or directory

    1 使用chroot命令时报错如下: testupgrade:/ # chroot /sb chroot: cannot change root directory to /sb: No such f ...

  3. 转-Determining whether a Computer Needs to be Rebooted

    1 如何检查机器是否因为装了Windows更新而需要重新启动 2 Determining whether a Computer Needs to be Rebooted 3 How can I tel ...

  4. 华人开创NTP网络授时服务器成功投运世界级超大工程港珠澳大桥

    华人开创NTP网络授时服务器成功投运世界级超大工程港珠澳大桥 本文由北京华人开创公司提供请勿转载 2017年12月中旬,我华人开创生产研发的NTP网络授时服务器成功投运世界级超大工程港珠澳大桥,为这个 ...

  5. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  6. JDOJ-P1260 VIJOS-P1083 小白逛公园

    首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec  Memor ...

  7. bzoj 4562 [Haoi2016]食物链

    4562: [Haoi2016]食物链 Time Limit: 10 Sec  Memory Limit: 128 MB Description 如图所示为某生态系统的食物网示意图,据图回答第1小题 ...

  8. 使用CefSharp开发一个12306“安心刷票弹窗通知”工具

    有需求就要改进 最近两年没有在春节回家过年了,主要是票太难买,虽然之前写了一个12306“无声购票弹窗”工具,解决了抢票问题,但是全家老小一起回去还是很累,干脆就在北京过年了.这两天突然有一个朋友问我 ...

  9. JAVA设计模式---模板方法

    1.定义: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. (为了防止子类改变模板方法中的算法,可以将模板方法声明为 ...

  10. js调DLL类库中的方法实现(非com组件形式)

    1.首先,创建一个Web空项目 2.添加一个html或aspx页面 3.页面代码如所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...