Подклассы NSTextField - PullRequest
       18

Подклассы NSTextField

2 голосов
/ 18 июня 2010

Учитывая все сложные вещи, которые я, кажется, освещаю каждый день, кажется, что «какого черта я делаю неправильно, что кажется простым?» сценарий!

Я бы хотел создать подкласс NSTextField для изменения цвета фона и цвета текста. Для простоты (и для того, чтобы помочь любому, кто еще ничего не делил на подклассы), вот пример моего (упрощенного) подкласса MyNSTextFieldSubclass ...

Шаг 1:

Создать файл подкласса:

Первый файл заголовка

@interface MyTextFieldSubclass : NSTextField {
}

@end

И файл метода

@implementation MyTextFieldSubclass

-(NSColor *)backgroundColor {
    return [NSColor redColor];
}

-(NSColor *)textColor {
    return [NSColor yellowColor];
}

@end

Шаг 2:

Перетащите NSTextField в окно в Интерфейсном Разработчике, выберите вкладку Identity в Инспекторе и выберите класс MyTextFieldSubclass

Шаг 3:

Сохраните файл IB, соберите и запустите приложение

Задача

Когда я запускаю сборку, текстовое поле не отражает подклассы цвета. Однако я знаю, что подкласс вызывается, потому что, если я добавлю следующий метод, он будет вызван при изменении текста.

-(void)textDidChange:(NSNotification *)notification {
    NSLog(@"My text changed");
}

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

Я знаю, что могу установить цвет в IB, но для любого, кто имел дело с лотом элементов пользовательского интерфейса, для которых требуется одинаковое оформление, создание подклассов делает жизнь более удобной.

По иронии судьбы, мне никогда не приходилось делать подкласс NSTextField раньше, и этот поставил меня в тупик.

Как обычно, любая помощь очень ценится. Я уверен, что это окажется "Doh!" момент - просто не могу видеть лес за деревьями прямо сейчас (к тому же я устал от того, что смотрю слишком много футбольного чемпионата мира рано утром, который никогда не помогает).

=== РЕШЕНИЕ ===

Согласно предложению Яануса, решение состоит в том, чтобы поместить его в метод viewWillDraw. Таким образом, мой (упрощенный) метод теперь будет выглядеть так:

@implementation MyTextFieldSubclass

-(void)viewWillDraw {
    [super setBackgroundColor:[NSColor redColor]];
    [super setTextColor:[NSColor yellowColor]];
}

@end

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

Ответы [ 2 ]

3 голосов
/ 18 июня 2010

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

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

РЕДАКТИРОВАТЬ: хорошо, если вы подклассы, потому что вы всегда хотите установить определенный цвет, вы бы сделали что-то вроде

-(void)viewDidAppear { // or whatever is the Appkit equivalent
    [super setBackgroundColor:...];
}
2 голосов
/ 18 июня 2010

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

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

...