无法识别的选择器发送到UIButton的实例

时间:2012-08-23 04:08:28

标签: iphone objective-c ios

创建了我自己的按钮子类,我得到了 - [UIRoundedRectButton setup]:无法识别的选择器发送到实例0x7c3e600'。

我认为这是因为buttonWithType只是返回一个明显不属于橙色按钮的按钮,但无法弄清楚如何做到这一点!

  @implementation OrangeButton

    +(id)Create
    {
        OrangeButton *button = (OrangeButton*)[OrangeButton buttonWithType:UIButtonTypeRoundedRect];
        [button setup];
        return button;
    }

    -(void) setup
    {
        [self setBG];     
    }
    -(void)setBG
    {
        [self setBackgroundImage:[UIImage imageNamed:@"bg-button-orange.gif"] forState:UIControlStateNormal];
    }

    @end

2 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题。 UIButton实际上是一个类集群 - 即当您实例化UIButton时,您可能会返回一个内部Button类(可能是不同的类,具体取决于按钮类型,但这是一个实现细节)。有几个像这样的Apple类(NSData是另一个)。

不幸的是,这意味着(实际上)不可能继承UIButton。如果您需要类似的功能,但又不想/不能使用直接的UIButton,那么附带UITapGestureRecogniser的UIView将是我的第一个调用点。

修改

将UITapGestureRecognizer附加到UIView为UIButton提供了非常相似(以及额外的额外,例如可变数量的抽头)功能。但是,而不是写下以下内容:

[someButton addTarget:aTarget action:yourSelector forControlEvents:UIControlEventTouchUpInside];

您需要创建并附加手势识别器:

UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:aTarget action:yourSelector];
yourUIView.userInteractionEnabled = YES;
[yourUIView addGestureRecognizer:tgr];

如果要围绕边缘,请添加:

yourUIView.layer.cornerRadius = 5 // example value

要获取图层属性,您需要导入QuartzCore.h标头。

答案 1 :(得分:1)

我认为它可能,因为我创建了自定义类

在.h,文件

@interface OrangeButton : UIButton
{
}
-(void) setBG;
@end

在.m文件中

@implementation OrangeButton

- (id) initWithFrame: (CGRect)frame
{
     self = [UIButton buttonWithType: UIButtonTypeRoundedRect];

     // set frame
     self. frame = frame;

     if (self) 
     {
        // change bg color   
        [self setBG];

        return self;
     }

    return nil;
}

-(void) setBG
{
    [self setBackgroundImage:[UIImage imageNamed:@"bg-button-orange.gif"] forState:UIControlStateNormal];
}

- (void)dealloc
{
    [super dealloc];
}

@end

现在,当您想要使用它时,请致电

OrangeButton *obj= [[OrangeButton alloc] initWithFrame: CGRectMake(0, 0, 90, 40)];
[obj setContentMode: UIViewContentModeScaleAspectFit];

// add it to the view
[self addSubview: obj];

// assign action
[obj addTarget: self action: someAction forControlEvents: UIControlEventTouchUpInside]; 

我认为这样做会