私は別の解決策を思いついた。Cocoaが@IBOutletCollectionをサポートしていれば、NSTableCellViewのサブクラス化は問題ありませんでした。その場合、セル内のすべてのNSTextFieldの配列を持つ1つのCellサブクラスを持つことができるためです。しかし、NSTextFieldの数が異なる多くの種類のセルがあったため、このオプションは気に入らなかった。代わりに、backgroundStyle
NSTableCellViewのプロパティに関するAppleのドキュメントを調べました。
デフォルトの実装では、setBackgroundStyleを実装するすべてのサブビューに呼び出しが自動的に転送されます。またはNSControlであり、backgroundStyleに応答するNSCellクラスがあります。
TextFieldsがsetBackgroundStyleを実装している場合、セルの選択が変更されたときに通知を受け取る必要があります。ただし、この背景スタイルの転送は再帰的ではありません。NSTextFieldsがNSStackViews内にあったため、メッセージを受信していませんでした。これを回避するために、すべてのNSViewにsetBackgroundStyleを実装する拡張機能を作成しました。メッセージを転送するだけです。最後に、NSTextFieldに拡張機能を追加して、このメソッドも実装しました。この拡張機能から、テキストの色を変更してスーパーと呼びます。サブクラスが必要ないため、このソリューションも優れています。NSTableCellViewまたはNSTextFieldのサブクラスはありません。
この機能をすべてのビューとすべてのNSTextFieldsに追加すると、NSTableViews内にないNSTextFieldsが予期せず色を変更するという問題が発生する可能性があります。しかし、これまでのところ、TableViews / OutlineViews内のものだけが色を変えており、まさにそれが私が探していたものです。予期しない色のテキストフィールドの変更が見られる場合は、NSTextFieldをサブクラス化し、すべてのNSTextFieldに追加するのではなく、そのサブクラスにのみsetBackgroundStyleオーバーライドを実装することをお勧めします。
私が使用したSwift3のコードは以下に貼り付けられています。
extension NSView {
func setBackgroundStyle(_ newValue: NSBackgroundStyle) {
for view in self.subviews {
view.setBackgroundStyle(newValue)
}
}
}
extension NSTextField {
override func setBackgroundStyle(_ newValue: NSBackgroundStyle) {
switch newValue {
case .dark:
self.textColor = NSColor.controlLightHighlightColor
case .light, .lowered, .raised:
self.textColor = NSColor.labelColor
}
super.setBackgroundStyle(newValue)
}
}