Подкласс UILabel

Я знаю, что это вопрос новичка, но я новичок, поэтому вот:

Я хочу довольно часто использовать шрифт Chalkduster в своем приложении (кнопки, метки и т. д.) и попытался создать подкласс UILabel для достижения этой цели. У меня есть следующее в Default.h:

#import <UIKit/UIKit.h>

@interface Default : UILabel
{
UILabel *theLabel;
}

@property (nonatomic, strong) IBOutlet UILabel *theLabel;

@end

и это в моем .m:

#import "Default.h"

@implementation Default

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code


UIFont *custom = [[UIFont alloc] init];

custom = [UIFont fontWithName:@"Chalkduster" size:18];

self.font = custom;


NSLog(@"h");
}
return self;
}

@end

Когда я меняю класс в построителе интерфейса и запускаю, я не вижу шрифта Chalkduster. Я был бы признателен за помощь в настройке, так как я считаю, что это сэкономит мне много времени. Ваше здоровье.


person Rob W    schedule 25.06.2012    source источник


Ответы (3)


Некоторые проблемы, которые нужно исправить:

1) Вы смешиваете идею Default быть ярлыком и Default содержать ярлык. Чтобы создать подкласс, избавьтесь от свойства внутри вашего класса и внесите изменения в self, а не в theLabel (внутри раздела if (self) {).

2) Все, что вы кодируете после безусловного return, не будет выполнено... и я удивлен, что компилятор не жаловался на эти операторы.

Редактировать: ...и еще одна вещь, которая только что пришла мне в голову.

3) Если вы загружаетесь из xib или раскадровки, инициализация выполняется initWithCoder: вместо initWithFrame:, поэтому:

- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        self.font = [UIFont fontWithName:@"Chalkduster" size:18];
    }
    return self;
}
person Phillip Mills    schedule 25.06.2012
comment
Я также пытался изменить theLabel на себя безрезультатно. Я уверен, что мне не хватает чего-то очень простого здесь... - person Rob W; 25.06.2012
comment
Как выглядит новый код? Если вы измените шрифт self при его создании и используете Default в IB, все должно работать. - person Phillip Mills; 25.06.2012
comment
Я переместил return self вниз, как описано выше, я также удалил свойство и переменную в .h. @synthesize тоже был удален. Я попробовал это с оператором NSLog, и он не появляется. Я также включил оператор #import по умолчанию в контроллер представления... Я все еще упускаю что-то простое? Не делайте предположений о моей глупости или еще чего :) - person Rob W; 25.06.2012
comment
Не могу добраться до своего компьютера, чтобы скопировать точный код, но позже, если это поможет? - person Rob W; 25.06.2012
comment
См. добавленный пример кода. Создание класса, содержащего этот метод, и назначение его как класса UILabel в раскадровке работает для меня. - person Phillip Mills; 25.06.2012
comment
Мне помогло изменение initWithFrame на initWithCoder. Спасибо - person Rob W; 25.06.2012

Во-первых, я не думаю, что вы правильно подклассифицируете UILabel. Поэтому я сделал учебник для вас, объясняющий, как это сделать. Вам не нужно создавать объект IBOutlet, который является подклассом. ПРОСТО ВЫЗВАЙТЕ ЭТО С СЕБЯ. например: self.font = ... Если вы хотите создать подкласс UILabel, сделайте следующее:

Создайте новый класс с названием myLabel следующим образом:

.h

#import <UIKit/UIKit.h>

@interface MyLabel : UILabel {

}

@end

#import "MyLabel.h"

@implementation MyLabel

-(void)awakeFromNib {

    UIFont *custom = [[UIFont alloc] init];
    custom = [UIFont fontWithName:@"Chalkduster" size:18];

    self.font = custom;
}

@end

Теперь выберите «Ваша метка» в раскадровке и перейдите в инспектор идентичности, а в пользовательском классе выберите созданный выше класс. Как это:

Снимок экрана

Вывод:

Скриншот 2

Примечание. Не забудьте выпустить кастомный, потому что вы его выделяете.

person Justin Boo    schedule 25.06.2012
comment
Это также сработало для меня. Большое спасибо за ваши усилия. Это отличный учебник - person Rob W; 25.06.2012
comment
@RobW Я рад, что помог Вам. - person Justin Boo; 25.06.2012

Переместите return self; на три строки вниз. Вы возвращаетесь из метода init до того, как выполните пользовательскую инициализацию.

Изменить, чтобы отразить новую информацию из комментария:

При десериализации представления из пера вам также необходимо переопределить initWithCoder:

person Nikolai Ruhe    schedule 25.06.2012
comment
Я попытался переместить линию, как описано, это все равно не сработало. Должен ли я что-то делать и в Interface Builder? - person Rob W; 25.06.2012