Подклассы UIButton, загруженные из перьев, не инициализируются должным образом - PullRequest
4 голосов
/ 03 сентября 2010

У меня есть очень простой подкласс UIButton:

@interface MyButton : UIButton
@end

@implementation MyButton

- (id) initWithCoder:(NSCoder *)decoder
{
    if (!(self = [super initWithCoder:decoder]))
        return nil;

    NSLog(@"-[%@ initWithCoder:%@]", self, decoder);

    return self;
}

@end

В Интерфейсном Разработчике я добавляю UIButton, устанавливаю его тип кнопки на Rounded Rect и его идентификатор класса на MyButton.

Во время работы у меня есть следующий журнал:

-[<MyButton: 0x5b23970; baseClass = UIButton; frame = (103 242; 114 37); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x5b23a90>> initWithCoder:<UINibDecoder: 0x6819200>]

, но кнопка больше не является круглой прямоугольной кнопкой.

Наблюдается на iOS 3.2 и iOS 4.

Это ошибка или я упускаю что-то очевидное?

Создание экземпляра MyButton программным путем не является приемлемым ответом, спасибо.

Ответы [ 2 ]

4 голосов
/ 03 сентября 2010

Программно, вы создаете экземпляр кнопки с +[UIButton buttonWithType:], которая на самом деле является фабрикой, которая возвращает подкласс UIButton. Таким образом, если вы наследуете от UIButton, вы на самом деле не производитесь от своего круглого прямоугольного класса кнопок (UIRoundedRectButton), а от универсального класса кнопок. Но вам не разрешено создавать подклассы из UIRoundedRectButton AFAIK, поскольку это внутренний класс.

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

Но вам могут пригодиться эти статьи:

Как переопределить -draw в подклассе UIButton?

http://www.cocoabuilder.com/archive/cocoa/284622-how-to-subclass-uibutton.html

http://www.cimgf.com/2010/01/28/fun-with-uibuttons-and-core-animation-layers/

Кроме того, я не знаю, почему вы хотите наследовать от UIButton, но если вы хотите выполнить некоторую настройку, не связанную с перезаписью каких-либо других методов, может быть полезно использовать тот факт, что вы можете сделать что-то вроде этого:

- (id)initWithCoder:(NSCoder *)decoder {
   // Decode the frame
   CGRect decodedFrame = ...;
   [self release];
   self = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   [self setFrame:decodedFrame];
   // Do the custom setup to the button
   return self;
}
0 голосов
/ 03 сентября 2010

Я не уверен, что это приемлемо для ваших нужд, но я склонен переопределять -awakeFromNib вместо -initWithCoder: в этих обстоятельствах.Решает ли это решение проблемы, с которой вы столкнулись?

...