可可触摸-iOS编程:扩展UIButton类的问题



我试图扩展UIButton类以添加一些方法,但在尝试初始化对象时遇到了一些问题。

-(id)init{
UIImage* image = [UIImage imageNamed:@"button_background.png"];    
CGRect frame=  CGRectMake(100.0, 70.0, 45.0 ,45.0);
self.frame = frame;
[self setTitle:@"title" forState:UIControlStateNormal];
[self setBackgroundImage:image forState:UIControlStateNormal];
[self setImage:image forState:UIControlStateNormal];
NSLog(@"type: %d",self.buttonType);
NSLog(@"x: %fny: %fnwidth: %fnheight: %f",frame.origin.x, frame.origin.y ,frame.size.width, frame.size.height);
NSLog(@"x: %fny: %fnwidth: %fnheight: %f",self.frame.origin.x, self.frame.origin.y ,self.frame.size.width, self.frame.size.height);
if(self != nil){
    //
}
return self;

}

它接缝良好,在执行过程中没有任何警告或错误。但在控制台中,frame和self.frame的值之间出现了一些不一致,当然按钮也不会出现在屏幕上。

type: 0
x: 100.000000
y: 70.000000
width: 45.000000
height: 45.000000
x: 0.000000
y: 0.000000
width: 0.000000
height: -1.998576

请帮帮我,我快疯了!:\

在Objective-C中进行子类化时,必须(1)重写指定的初始化器(2)调用超类的指定初始化器。你两者都不做。

你应该做这样的事情:

/** 
 * brief Convenience class method to replace button method of UIButton
 */
+(id)myButton
{
    MyButton* myButton = [[MyButton alloc] 
                              initWithFrame:CGMakeRect(100.0, 70.0, 45.0, 45.0)];
    return [myButton autorelaase];
}
-(id)initWithFrame:(CGRect)f
{
    if(self = [super initWithFrame:f])
    {
        UIImage* image = [UIImage imageNamed:@"button_background.png"];    
        [self setTitle:@"title" forState:UIControlStateNormal];
        [self setBackgroundImage:image forState:UIControlStateNormal];
        [self setImage:image forState:UIControlStateNormal];
        NSLog(@"type: %d",self.buttonType);
        NSLog(@"x: %fny: %fnwidth: %fnheight: %f", NSStringFromCGRect(frame));
        NSLog(@"x: %fny: %fnwidth: %fnheight: %f", NSStringFromCGRect(self.frame));
    }
    return self;
}

希望这能有所帮助。如果你需要更多信息,请告诉我。

在您登录的那一刻,您没有将按钮添加到任何视图中。不管怎样,代码一定是这样的?

-(id)init{

if(self != nil){
    UIImage* image = [UIImage imageNamed:@"button_background.png"];    
CGRect frame=  CGRectMake(100.0, 70.0, 45.0 ,45.0);
self.frame = frame;
[self setTitle:@"title" forState:UIControlStateNormal];
[self setBackgroundImage:image forState:UIControlStateNormal];
[self setImage:image forState:UIControlStateNormal];
NSLog(@"type: %d",self.buttonType);
NSLog(@"x: %fny: %fnwidth: %fnheight: %f",frame.origin.x, frame.origin.y ,frame.size.width, frame.size.height);
NSLog(@"x: %fny: %fnwidth: %fnheight: %f",self.frame.origin.x, self.frame.origin.y ,self.frame.size.width, self.frame.size.height);
}
return self;

顺便说一句,你忘了调用超类init吗?

我刚刚在这里回答了一个非常相似的问题:如何在iOS 中创建一个非常自定义的UI按钮,如UITableViewCellStyleSubtitle

正如其他人所指出的,UIButton是一个类簇,所以你可能不想将其子类化。但是,与其将UIControl子类化,你可能会发现创建UIButton的类别更容易。

最新更新