在iOS中的自定义视图中以编程方式创建按钮不触发事件

时间:2012-12-18 01:15:37

标签: iphone objective-c ios uibutton

在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];
}

4 个答案:

答案 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.frameself.view.bounds,您至少应该等到viewWillAppear被调用。

此外,您的按钮origin.y位于350,在最大高度仅为88的视图中。父级框架外的任何控件都不会接收到触摸..