Objective-C использует typedef enum для установки поведения класса, например, Cocoa - PullRequest
2 голосов
/ 29 октября 2009

Я расширяю класс 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

Это нормально, но, конечно, не очень гибко. Как включить использование перечисления typedef (как это делает Apple) для всех различных цвета, шрифты и размеры, которые я бы хотел, чтобы моя пользовательская кнопка соответствовала.

Единственное, что я могу получить из файлов интерфейса из UIKit, это то, что это делается так:

typedef enum {
RGCustomNavBarButtonStyleBlue,
RGCustomNavBarButtonStyleGrey,
RGCustomNavBarButtonStyleBlack,
RGCustomNavBarButtonStyleGreen,
RGCustomNavBarButtonStyleRed, 
} RGCustomNavBarButtonStyle;

Как получить из этого и в работающую реализацию, которая принимает шрифт, размер, цвет и т. Д. Из значений перечисления через конструктор (initWithStyle)?

Можно ли перегружать конструкторы в Objective C? несколько конструкторов?

Надеюсь, что это имеет смысл, и спасибо за любую помощь, оказанную:)

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

Чтобы расширить сказанное выше ennuikiller, меня научили (книга Хиллегаса) выбрать один инициализатор - обычно тот, у которого больше всего опций, например, initWithFont: andColor: - и чтобы другие инициализаторы вызывали его. Этот основной инициализатор называется назначенным инициализатором.

Таким образом, ваш код будет иметь полностью реализованный initWithFont: andColor: который вызывает [super init], и тогда у вас также будет initWithFont: который выглядит примерно так:

-(MyClass) initWithFont: (UIFont) font
{
    [self initWithFont:font andColor:RGCustomNavBarButtonStyleBlack];
}

Тогда ваш initWithFont: andColor: обработает все остальные настройки и вызовет [super init].

1 голос
/ 29 октября 2009

Вы можете иметь несколько конструкторов, таких как;

-(MyClass) initWithFont: (UIFont) font;
-(MyClass) initWithFonmt: (UIFont) font andColor: (UIColor) color;

и т.д.

Затем вызовите [super init] в качестве первой строки в каждом из ваших пользовательских конструкторов.

...