Программирование на iOS: проблема расширения класса UIButton - PullRequest
0 голосов
/ 21 мая 2011

Я пытаюсь расширить класс 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: %f\ny: %f\nwidth: %f\nheight: %f",frame.origin.x, frame.origin.y ,frame.size.width, frame.size.height);
NSLog(@"x: %f\ny: %f\nwidth: %f\nheight: %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

Пожалуйста, помогите мне, я схожу с ума! : \

Ответы [ 3 ]

1 голос
/ 21 мая 2011

Когда вы создаете подклассы в 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: %f\ny: %f\nwidth: %f\nheight: %f", NSStringFromCGRect(frame));
        NSLog(@"x: %f\ny: %f\nwidth: %f\nheight: %f", NSStringFromCGRect(self.frame));
    }
    return self;
}

Надеюсь, это поможет. Дайте мне знать, если вам нужно больше информации.

0 голосов
/ 28 мая 2011

Я только что ответил на очень похожий вопрос: Как создать очень настраиваемый uibutton, такой как UITableViewCellStyleSubtitle, в iOS

Как и некоторые другие люди, UIButton является кластером классов, поэтомуВы, вероятно, не хотите подкласс этого.Но вместо того, чтобы создавать подклассы UIControl, вам может быть проще создать категорию UIButton.

0 голосов
/ 21 мая 2011

В тот момент, когда вы входите в систему, вы не добавили кнопку в любой вид. В любом случае код должен выглядеть примерно так?

-(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: %f\ny: %f\nwidth: %f\nheight: %f",frame.origin.x, frame.origin.y ,frame.size.width, frame.size.height);
NSLog(@"x: %f\ny: %f\nwidth: %f\nheight: %f",self.frame.origin.x, self.frame.origin.y ,self.frame.size.width, self.frame.size.height);
}
return self;

Кстати, не забыли ли вы вызвать init суперкласса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...