Учитывая все сложные вещи, которые кажутся мне кажущимися каждый день, это выглядит как «то, что я делаю неправильно, что кажется простым?» сценарий!Подкласс NSTextField
Я хотел бы подклассы NSTextField
изменить цвет фона и цвет текста. Для простоты (и, чтобы помочь любому, кто никогда не подклассы ничего раньше), вот пример моей (упрощенный) подклассу MyNSTextFieldSubclass
...
Шаг 1:
Создайте файл подкласса:
Первый заголовочный файл
@interface MyTextFieldSubclass : NSTextField {
}
@end
И файл метод
@implementation MyTextFieldSubclass
-(NSColor *)backgroundColor {
return [NSColor redColor];
}
-(NSColor *)textColor {
return [NSColor yellowColor];
}
@end
Шаг 2:
Перетащите NSTextField
к окну в Interface Builder, выберите вкладку Identity
в инспекторе и выберите класс MyTextFieldSubclass
Шаг 3:
Сохранить IB, создать и запустить приложение
Задача
Когда я запускаю сборку, текстовое поле не отображает подклассы цветов. Тем не менее, я знаю, что подкласс вызывается, потому что, если я добавлю следующий метод, он будет вызван в текстовые изменения.
-(void)textDidChange:(NSNotification *)notification {
NSLog(@"My text changed");
}
Так почему же изменение цвета не происходит в текстовых полях?
Я знаю, что я могу установить цвет в IB, но для тех, кто имеет дело с лот элементов интерфейса, которые все нуждаются в одном стиле, подклассы делают жизнь проще, проще.
По иронии судьбы, мне никогда не приходилось подклассифицировать NSTextField
раньше, и этот меня смутил.
Как обычно, любая помощь очень ценится. Я уверен, что это будет «Doh!». момент - просто не могу увидеть лес для деревьев прямо сейчас (плюс я устал от просмотра слишком много чемпионата мира по футболу рано утром, который никогда не помогает).
=== РЕШЕНИЕ ===
Как предлагают Jaanus решение поместить его в метод viewWillDraw
. Таким образом, мой (упрощенный) метод будет выглядеть следующим образом:
@implementation MyTextFieldSubclass
-(void)viewWillDraw {
[super setBackgroundColor:[NSColor redColor]];
[super setTextColor:[NSColor yellowColor]];
}
@end
Спасибо, ребята, за вашу помощь.
Яанус, я не думаю, что ответ Престона подходит для управления множеством текстовых полей в большом приложении (по причинам, указанным в моих комментариях к его ответу). Я согласен, что это работает, и это один из способов сделать это, но он не решает проблему управления множеством текстовых полей, для которых всем нужен одинаковый стиль. Насколько я понимаю, подкласс, который я привел в приведенном выше примере, должен возвращать «красный» для фона и «желтый» для текста на любом TextField, который использует этот подкласс. Мне не нужно вызывать сеттер, когда я могу заставить цвет вернуть в геттер. – Hooligancat
Я думаю, что мое последнее редактирование - это то, что вы ищете. – Jaanus
Jaanus - ваше редактирование перечеркнуто в сообщениях! Ты понял. Я положил его в метод '- (void) viewWillDraw'. Работала отлично. Спасибо. – Hooligancat