Изменить шрифт, цвет шрифта и цвет фона NSTableView во время выполнения с помощью NSFontPanel?
Я бы хотел, чтобы пользователь мог изменить шрифт на основе вида NSTableView
, Я использую привязки Какао и Основные данные. В моем тестовом коде у меня есть changeFont:
метод, который вызывается, как только я нажимаю сочетание клавиш, например cmd-I
или же cmd-B
, но мне пока не повезло в изменении фактического шрифта табличного представления:
- (void)changeFont:(id)sender
{
NSFont *oldFont = [self.airportTableView font];
NSFont *newFont = [sender convertFont:oldFont];
NSLog(@"sender: %@ oldfont: %@, newFont: %@ fontmanager selected: %@, font panel selected: %@",
sender, oldFont, newFont, [sender selectedFont], [sender convertFont:[sender selectedFont]]);
[self.airportTableView setFont:newFont];
}
производит следующий вывод:
sender: <NSFontManager: 0x6080000b4580> oldfont: (null), newFont: (null) fontmanager selected: (null), font panel selected: (null)
Даже этот тривиальный код:
font = [NSFont boldSystemFontOfSize:12];
[self.airportTableView setFont:font];
NSFont *oldFont = [self.airportTableView font];
NSLog(@"oldfont: %@",oldFont);
только результаты в:
oldfont: (null)
Может ли какая-то добрая душа предоставить некоторый код, который позволяет пользователю изменять шрифт NSTableView?
2 ответа
Вы должны установить шрифт ячейки. Не за столом. Используйте следующий метод делегата:
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSTextFieldCell *cell = [tableColumn dataCell];
[cell setFont:[NSFont systemFontOfSize:11]];
[cell setTextColor: [NSColor lightGrayColor]];
return cell;
}
Используя возможности интернета, я смог собрать следующий фрагмент кода, который отвечает NSFontPanel
действия для изменения типа шрифта, цвета шрифта и цвета фона NSTableView
:
@interface AppDelegate
{
NSFont *_font;
NSColor *_fontColor;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[[NSFontManager sharedFontManager] setTarget:self];
_font = [NSFont systemFontOfSize:0];
_fontColor = [NSColor blackColor];
}
- (void)changeFont:(id)sender
{
_font = [sender convertFont:_font];
[self.airportTableView reloadData];
}
- (void)setColor:(NSColor *)col forAttribute:(NSString *)attr {
if ([attr isEqualToString:@"NSDocumentBackgroundColor"]) {
self.airportTableView.backgroundColor = col;
} else if ([attr isEqualToString:@"NSColor"]) {
_fontColor = col;
[self.airportTableView reloadData];
}
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSTableCellView *cellView = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:self];
NSTextField *textField = [cellView textField];
textField.font = _font;
textField.textColor = _fontColor;
return cellView;
}
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
return _font.boundingRectForFont.size.height + 2.0f;
}
Обратите внимание на явные призывы к reloadData
иначе видимая часть табличного представления не будет обновлена. Дайте мне знать, если есть лучшие решения.
Также обратите внимание, что -setColor:forAttribute:
не имеет документов Очевидно, если ваш класс отвечает на это, -changeAttributes:
не позвонят.