Objective-C использует перечисление typedef для установки поведения класса, например Cocoa.
Вопрос
Я расширяю класс UIButton, чтобы иметь возможность устанавливать шрифт и цвет UINavigationBarButton (из этого примера кода: включить код )
Я делаю так:
@interface NavBarButtonGrey : UIButton
-(id)init;
@end
@implementation NavBarButtonGrey
-(id)init {
if(self = [super init]) {
self.frame = CGRectMake(0, 0, 49.0, 30.0);
self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
UIImage *image = [UIImage imageNamed:@"greyNavButton.png"];
UIImage *stretchImage =
[image stretchableImageWithLeftCapWidth:15.0 topCapHeight:0.0];
[self setBackgroundImage:stretchImage forState:UIControlStateNormal];
self.backgroundColor = [UIColor clearColor];
[self setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal];
self.titleShadowOffset = CGSizeMake(0, -1);
self.titleLabel.font = [UIFont boldSystemFontOfSize:13];
}
return self;
}
@end
Это нормально, но, конечно, не очень гибко.Как мне включить использование enum typedef (как Apple) для всех различных цветов, шрифтов и размеров, с которыми я бы хотел, чтобы моя пользовательская кнопка соответствовала.
Единственное, что я могу получить из файлов интерфейса от UIKit, это то, что это сделано так:
typedef enum {
RGCustomNavBarButtonStyleBlue,
RGCustomNavBarButtonStyleGrey,
RGCustomNavBarButtonStyleBlack,
RGCustomNavBarButtonStyleGreen,
RGCustomNavBarButtonStyleRed,
} RGCustomNavBarButtonStyle;
Как перейти от этого к работающей реализации, которая принимает шрифт, размер, цвет и т. д.из значений перечисления через конструктор (initWithStyle)?
Перегружаются ли конструкторы в Objective C?несколько конструкторов?
Надеюсь, это имеет смысл, и спасибо за любую оказанную помощь :)
Решение
Вы можете иметь несколько конструкторов, например;
-(MyClass) initWithFont: (UIFont) font;
-(MyClass) initWithFonmt: (UIFont) font andColor: (UIColor) color;
и т. д.
Затем вызовите [super init] в качестве первой строки в каждом из ваших пользовательских конструкторов.
Другие советы
Чтобы расширить сказанное выше ennuikiller, меня научили (книга Хиллегаса) выбрать один инициализатор - обычно тот, у которого больше всего опций, например, initWithFont: andColor: - и чтобы другие инициализаторы вызывали его. Этот основной инициализатор называется назначенным инициализатором.
Таким образом, ваш код будет иметь полностью реализованный initWithFont: andColor: который вызывает [super init], и тогда у вас также будет initWithFont: который выглядит примерно так:
-(MyClass) initWithFont: (UIFont) font
{
[self initWithFont:font andColor:RGCustomNavBarButtonStyleBlack];
}
Тогда ваш initWithFont: andColor: обработает все остальные настройки и вызовет [super init].