2010-06-17 4 views
2

Учитывая все сложные вещи, которые кажутся мне кажущимися каждый день, это выглядит как «то, что я делаю неправильно, что кажется простым?» сценарий!Подкласс 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 

Спасибо, ребята, за вашу помощь.

ответ

3

Престон прав: чтобы изменить цвета, вы не должны подкласса, просто измените свойства текстового поля. (О, это NSTextfield, это, вероятно, не имеет свойства, а потом ... ну, просто использовать методы получения и установки или настроить его правильно в IB.)

Как

Так почему же изменение цвета не появляются в текстовых полях?

Потому что вы сбиваете с толку геттеры и сеттеры. В вашем подклассе вы реализовали их как геттеры, где они просто возвращают цвет. В действительности, они должны быть функциями setter (и так они реализуются в кишках NSTextfield): вы передаете им цвет, и затем они идут и играют с любыми внутренними NSTextfield, чтобы сделать изменение цвета.

EDIT: хорошо, если вы подклассы, потому что вы всегда хотите установить определенный цвет, вы могли бы сделать что-то вроде

-(void)viewDidAppear { // or whatever is the Appkit equivalent 
    [super setBackgroundColor:...]; 
} 
+0

Яанус, я не думаю, что ответ Престона подходит для управления множеством текстовых полей в большом приложении (по причинам, указанным в моих комментариях к его ответу). Я согласен, что это работает, и это один из способов сделать это, но он не решает проблему управления множеством текстовых полей, для которых всем нужен одинаковый стиль. Насколько я понимаю, подкласс, который я привел в приведенном выше примере, должен возвращать «красный» для фона и «желтый» для текста на любом TextField, который использует этот подкласс. Мне не нужно вызывать сеттер, когда я могу заставить цвет вернуть в геттер. – Hooligancat

+0

Я думаю, что мое последнее редактирование - это то, что вы ищете. – Jaanus

+0

Jaanus - ваше редактирование перечеркнуто в сообщениях! Ты понял. Я положил его в метод '- (void) viewWillDraw'. Работала отлично. Спасибо. – Hooligancat

2

Поскольку вы можете установить цвет фона и цвет текста NSTextField в Attributes инспектора Interface Builder, или вы можете использовать -setBackgroundColor: и -setTextColor: программно, не должно быть никакой необходимости создавать подкласс только для изменения цвета. Похоже, перебор.

Редактировать: Если укладка множества элементов является проблемой, считаете ли вы использование привязок для цветов? Последнее, что я проверил, NSTextField не имеет привязки для цвета фона, но поскольку вы все равно используете подкласс, вы можете add a binding for it.

+0

Спасибо Престона, но существует необходимость в создании подкласса. Установка атрибутов в IB означает, что вы должны сделать это для каждого поля. Кроме того, позволяя пользователю динамически изменять настройки, становится трудно управлять, когда они устанавливаются непосредственно в IB. Кроме того, выполнение '-setTextColor' и фона для каждого представления означает управление целым набором параметров. Подклассификация устраняет все эти проблемы. Кроме того, позволяет обновлять в будущем в одном месте без необходимости касаться многих файлов. Это идеальное использование подкласса. – Hooligancat

+0

Считаете ли вы использование привязок для цветов? – 2010-06-17 21:31:05

+0

Если честно, нет, но это может быть вариант. Вообще говоря, я стараюсь избегать использования привязок из IB, потому что это усложняет жизнь при отслеживании изменений кода между разработчиками, использующими программное обеспечение для управления версиями. Я предполагаю, что в теории я мог бы связывать цвета, но мне еще не нужно было бы подклассы или определять привязки на каждом текстовом поле? – Hooligancat

Смежные вопросы