NSTableViewで選択された行のテキストが黒字になってしまう場合の対処法

# 概要
- 選択時のテキストの色が白色にならず黒色のままになる現象が起きた。
- また10.14のみで発生。

### 非選択時

![-w412](https://i.imgur.com/zc68tx5.jpg)

### 選択時（macOS 10.14）

![Downloads 7](https://i.imgur.com/1bW3Bsa.png)
### 選択時（macOS10.13.6）

![-w412](https://i.imgur.com/uIKfcTD.jpg)

## 解決法

- テキストの色を`blackColor`と指定していたのが原因。
- セルのテキストｎデフォルトで設定されている`NSColor.controlTextColor`を指定するのが良い。
- 上記の画像の通り、10.14からNSColorの処理に変化があったのだろう。
    - [AppKit Release Notes for macOS 10\.14](https://developer.apple.com/documentation/macos_release_notes/macos_mojave_10_14_release_notes/appkit_release_notes_for_macos_10_14?language=objc)
    - リリースノートにもNSColorへの言及がある。ダークモードの導入による変更だろう。
    
![-w1402](https://i.imgur.com/2AcZIwf.jpg)

## 参考

- [UI Element Colors](https://developer.apple.com/documentation/appkit/nscolor/ui_element_colors?language=objc)
    - Appleが示す使用例
- [AppKit Release Notes for macOS 10\.14](https://developer.apple.com/documentation/macos_release_notes/macos_mojave_10_14_release_notes/appkit_release_notes_for_macos_10_14?language=objc)
    - リリースノートを見てもずばりコレというのはなかった。
- [NSColor to use for selected table view text](https://stackoverflow.com/questions/51712885/nscolor-to-use-for-selected-table-view-text)
    - `alternateSelectedControlTextColor`とあるがこの辺が関連しているのだろうか。

# 今回使用したコード

- レガシーなcell baseのテーブルビューです。
- セルの表示時に呼ばれる以下のメソッドでテキストの色を設定します。

```objc
- (void)tableView:(NSTableView *)tableView
  willDisplayCell:(id)cell
   forTableColumn:(NSTableColumn *)tableColumn
              row:(NSInteger)row {
```

## AppDelegate.m

```objc
#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

```objc
//
//  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
```