NSTableView에서 선택한 행의 텍스트가 흑자로 되어 버리는 경우의 대처법

개요


  • 선택시의 텍스트의 색이 백색이 되지 않고 흑색인 상태가 되는 현상이 일어났다.
  • 또한 10.14에서만 발생.

  • 비선택 시





    선택 시(macOS 10.14)





    선택 시(macOS10.13.6)





    해결책


  • 텍스트의 색을 blackColor 로 지정했기 때문에.
  • 셀의 텍스트 n 디폴트로 설정되어 있는 NSColor.controlTextColor 를 지정하는 것이 좋다.
  • 위의 그림과 같이 10.14부터 NSColor의 처리에 변화가 있었을 것이다.
  • AppKit Release Notes for macOS 10.14
  • 릴리즈 노트에도 NSColor에 대한 언급이 있다. 다크 모드의 도입에 의한 변경일 것이다.




  • 참고



  • UI Element Colors
  • Apple이 나타내는 사용 예


  • AppKit Release Notes for macOS 10.14
  • 릴리즈 노트를 봐도 확실히 이것이라고 하는 것은 없었다.


  • NSColor to use for selected table view text
  • alternateSelectedControlTextColor 라고 있는데 이 근처가 관련되어 있는 것일까.


  • 이번에 사용한 코드


  • 레거시 셀 base의 테이블 뷰입니다.
  • 셀을 표시할 때 호출되는 다음 메서드로 텍스트 색상을 설정합니다.
  • - (void)tableView:(NSTableView *)tableView
      willDisplayCell:(id)cell
       forTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
    

    AppDelegate.m


    #import "AppDelegate.h"
    #import "TableViewController.h"
    
    @interface AppDelegate ()
    @property (weak) IBOutlet NSWindow *window;
    @property TableViewController *tableViewController;
    @end
    
    @implementation AppDelegate
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        // Insert code here to initialize your application
        TableViewController *tableViewController = [[TableViewController alloc] init];
        [tableViewController showWindow:self];
        _tableViewController = tableViewController;
    }
    
    
    - (void)applicationWillTerminate:(NSNotification *)aNotification {
        // Insert code here to tear down your application
    }
    
    @end
    

    TableViewController.m


    //
    //  TableViewController.m
    //  NSTableView_SelectedRowTextColor
    
    #import "TableViewController.h"
    
    @interface TableViewController ()<NSTableViewDelegate, NSTableViewDataSource>
    @property (weak) IBOutlet NSTableView *tableView;
    @property NSArray<NSString *> *tableViewData;
    @end
    
    @implementation TableViewController
    
    - (id)init {
        if (self = [super initWithWindowNibName:[self className] owner:self]) {
    
            _tableViewData = @[@"NSColor.blackColor",
                               @"NSColor.controlTextColor",
                               @"NSColor.textColor",
                               @"NSColor.labelColor"];
        }
        return self;
    }
    
    - (void)windowDidLoad {
        [super windowDidLoad];
    
        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }
    
    // MARK:- NSTableView Delegate
    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
        return _tableViewData.count;
    }
    
    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
        return _tableViewData[row];
    }
    
    // テーブルビューの内容表示前に呼ばれる
    - (void)tableView:(NSTableView *)tableView
      willDisplayCell:(id)cell
       forTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
        [cell setTextColor:NSColor.blackColor];
        switch (row) {
            case 0:
                [cell setTextColor:NSColor.blackColor];
                break;
            case 1:
                [cell setTextColor:NSColor.controlTextColor];
                break;
            case 2:
                [cell setTextColor:NSColor.textColor];
                break;
            case 3:
                [cell setTextColor:NSColor.labelColor];
                break;
            default:
                break;
        }
    }
    @end
    

    좋은 웹페이지 즐겨찾기