Objective-C использует перечисление typedef для установки поведения класса, например Cocoa.

StackOverflow https://stackoverflow.com/questions/1642976

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top