これがSwiftでの解決策です。遅くて疲れているので、これはおそらく最適ではありませんが、うまくいきます。
まず、特定のビューをスキップするオプションを使用して、階層内のビューを検索する関数を次に示します。window.contentView.superview.subviews
(これは、検索を行っていて、 内の独自のビューを無視したい場合に便利ですcontentView
)
func findViewInSubview(subviews: [NSView], #ignoreView: NSView, test: (NSView) -> Bool) -> NSView? {
for v in subviews {
if test(v) {
return v
} else if v != ignoreView {
if let found = findViewInSubview(v.subviews as [NSView], ignoreView: ignoreView, test) {
return found
}
}
}
return nil
}
NSViewController
サブクラスなどからの使用方法は次のとおりです。ウィンドウが表示されたときに行う必要があるため、 では実行できないことに注意してくださいviewDidLoad
。
override func viewDidAppear() {
if let windowContentView = view.window?.contentView as? NSView {
if let windowContentSuperView = windowContentView.superview {
let titleView = findViewInSubview(windowContentSuperView.subviews as [NSView], ignoreView: windowContentView) { (view) -> Bool in
// We find the title by looking for an NSTextField. You may
// want to make this test more strict and for example also
// check for the title string value to be sure.
return view is NSTextField
}
if let titleView = titleView as? NSTextField {
titleView.attributedStringValue = NSAttributedString(string: "Hello", attributes: [NSForegroundColorAttributeName: NSColor.redColor()])
}
}
}
}
火遊びをしていることに注意してください。このような内部は、理由により指定されていません。