在iOS上,我以编程方式创建了一个按钮,但事件未触发。
UIButton * anyButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[anyButton addTarget:self action:@selector(handleAnyButton:) forControlEvents:UIControlEventTouchUpInside];
anyButton.frame = CGRectMake(150, 350, 22, 22);
[self addSubview:anyButton];
代码放在自定义视图(不是自定义视图控制器)中,但是我不能让它触发事件。新闻动画没有显示。自定义视图启用了userInteractionEnabled。我也尝试使用故事板在同一个视图上创建另一个按钮,并且一个按钮正在工作。按钮代码在initWithFrame中完成。一定是一些我没有抓到的简单错误,而且我已经在这个问题上花了好几个小时。
编辑:
事件处理程序:
-(void) handleAnyButton:(UIButton *)button
{
NSLog(@"handleAnybutton called");
}
EDIT2: 上面的按钮代码在类PKLocationsSelectionView的[self setup]中完成。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self setup];
}
return self;
}
此视图是在负责此层次结构的视图控制器(PKLocSelectionViewController)中以编程方式创建的:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
CGFloat fieldsHeight = 88;
UIView * view = [[PKLocationsSelectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, fieldsHeight)];
[self.view addSubview:view];
}
答案 0 :(得分:3)
它看起来像你的按钮框架
anyButton.frame = CGRectMake(150, 350, 22, 22);
超出父界限
CGFloat fieldsHeight = 88;
UIView * view = [[PKLocationsSelectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, fieldsHeight)];
答案 1 :(得分:0)
EDIT2:可能是Button没有完全包含在容器坐标(PKLocationsSelectionView)视图中吗?
您的代码中PKLocationsSelectionView的高度为88,按钮的位置似乎超出此范围。我认为如果按钮没有包含在超视图的框架内,那么它将不会接收到触摸。
答案 2 :(得分:0)
以下是适用于我的代码:
MyCustomView.m:
#import "MyCustomView.h"
@implementation MyCustomView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 100, 100);
[button addTarget:self action:@selector(greet:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Greet" forState:UIControlStateNormal];
[self addSubview:button];
self.backgroundColor = [UIColor greenColor];
}
return self;
}
-(void) greet:(id) sender
{
NSLog(@"greet!");
}
这是ViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
MyCustomView *view = [[MyCustomView alloc] init];
view.frame = CGRectMake(0, 0, 100, 100);
[self.view addSubview:view];
}
答案 3 :(得分:0)
尝试并更改viewDidLoad
中的查看初始化代码,以提供静态框架并查看其是否有效..
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
CGFloat fieldsHeight = 88;
//See the change in below line.. instead of using self.view.bounds.size.width
// I used a static width.. 320 pixel for the moment..
UIView * view = [[PKLocationsSelectionView alloc] initWithFrame:CGRectMake(0, 0, 320.0, fieldsHeight)];
[self.view addSubview:view];
}
在viewDidLoad
视图中,控制器的层次结构将无法完全绘制。因此self.view.bounds.size.width
可能提供的值不正确..要访问self.view.frame
和self.view.bounds
,您至少应该等到viewWillAppear
被调用。
此外,您的按钮origin.y位于350,在最大高度仅为88的视图中。父级框架外的任何控件都不会接收到触摸..