Как добавить свойства / методы в UIButton - PullRequest
2 голосов
/ 23 февраля 2011

Мне нужно добавить два дополнительных свойства (NSString * и NSMutableArray *) вместе с тремя дополнительными методами в UIButton. Я также хочу ссылаться на новые объекты, используя супертип, если это возможно. Я не обязательно хочу создавать подклассы (поскольку я читал, что это сложно и не рекомендуется), но я довольно новичок в разработке Objective-C и iOS и не знаю, что еще делать.

Я попытался создать подкласс UIButton с моим подклассом, реализующим формальный протокол следующим образом:

@interface Button : UIButton <MyProtocol> ...

Однако я обнаружил, что это не работает так, как я думал, потому что buttonWithType: возвращает объект из подкласса. Что еще я могу сделать, чтобы достичь желаемого результата?

- РЕДАКТИРОВАТЬ: Хорошо, мой текущий код выглядит так:

@interface Button : UIButton <SteapeObject> {
    ActionQueue * actions;
    Meta meta;
}

@property (nonatomic, retain) ActionQueue * actions;
@property (nonatomic) Meta meta;

- (id) initWithFrame:(CGRect)frame;
...

И реализация:

- (id) initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        NSLog (@"finally");
    }

    return self;
}

Все еще не работает. Кажется, что когда я призываю:

Button * button = [Button buttonWithType: UIButtonTypeRoundedRect];
NSLog (@"%@", [button description]);

Я должен получить две строки 'finally' и два описания в журнале. Однако я получаю только две строки описания:

[Session started at 2011-02-24 09:47:14 +0100.]
2011-02-24 09:47:15.431 IphoneClient3[702:207] <UIRoundedRectButton: 0x5f47690; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x5f47240>>
2011-02-24 09:47:15.461 IphoneClient3[702:207] <UIRoundedRectButton: 0x6a0f000; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x6a344b0>>

И вы можете видеть, что тип все еще UIRoundedRectButton, но кнопки не реагируют на мои добавленные методы. На самом деле, поскольку мой переопределенный initWithFrame не вызывается, этого следовало ожидать. Возможно, я должен по умолчанию реализовать пользовательский элемент управления ...

Ответы [ 4 ]

2 голосов
/ 04 апреля 2011

Я обнаружил, что невозможно выполнить эту задачу с текущей реализацией SDK.

2 голосов
/ 23 февраля 2011

Используйте Категория .

@interface UIButton (MyButtonCategory)
- (void) myMethod;

@end


@implementation UIButton (MyButtonCategory)
- (void) myMethod
{
   NSLog(@"Called myMethod!");
}

@end

[РЕДАКТИРОВАТЬ]

В качестве альтернативы, если я наконец вас понимаю, вы можете сделать это.

@interface MyButton : UIButton

- (id) initWithFrame:(CGRect)rect;

@end

@implementation MyButton

- (id) initWithFrame:(CGRect)rect
{
    if ((self = [super initWithFrame:rect])){

    // Do your init in here

    }
    return self;

}

@ end

Тогда звоните

MyButton *btn = [MyButton buttonWithType:UIButtonTypeRoundedRect];

Должен получить то, что вы хотите.buttonWithType должен вызвать initWithFrame на вашем подклассе.

2 голосов
/ 23 февраля 2011

Насколько я знаю, в документе не сказано, что подклассы UIButton не рекомендуется.

Я сделал это несколько раз, чтобы добавить пользовательские свойства - без проблем. Единственное, что нужно сделать, это создать кнопку, используя:

[Button buttonWithType:UIButtonTypeCustom]; // won't work for other button types though
1 голос
/ 23 февраля 2011

Категории могут помочь. Реализуйте так:

//In the UIButtonMyExtras.h file
@interface UIButton(MyExtras)
//extras
@end


//In the UIButtonMyExtras.m file
@implementation UIButton(MyExtras)
//extra implementation
@end

Это добавляет эти дополнения к каждому UIButton в вашем проекте.

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