this questionと同様に、私は最初のレスポンダを3つのうちの最初のものに設定しようとしています。NSTextField
はとても簡単なアプリです。そこにあるアドバイス(Window
のインターフェースビルダーの最初のレスポンダーを設定)は、Storyboardsが関係しているときには、少なくとももう適用しないようです。 Window
オブジェクトは実際にはinitialFirstResponder
アウトレットを持っていますが、NSTextFieldとの間のどちらの方向にもドラッグ、ドラッグ、ドラッグなどで設定する方法はありません。ストーリーボードOSXアプリケーションでinitialFirstResponderを設定する
構造IBは、ビューコントローラシーン(これにはNSTextField
とラベルのセットが含まれています)にリンクされたウィンドウコントローラシーン(それ自体は空のウィンドウ)を備えています。
私の疑惑は、Xcodeがアプリケーションに焼き付けられて、実行時に特定のビューを自動的にロードする原因となるいくつかの既定の仮定/関連があることです。そのため、初期レスポンダをバインドすることができませんビルド時に知っている。それで、遅くなる前に、どのオブジェクトのライフサイクルコールがself.view.window.initialFirstResponder = myTextField
という正しいポイントであるか、そしてそのオブジェクトへのアクセスを最も正確に得る方法が不思議に思えます。 View ControllerのviewWillAppear
またはviewDidLoad
は正しいと感じていますが、いずれも確実に影響を及ぼさないようです(最初はアクティブなNSTextField
が実行ごとに異なりますが、コードの変更を追跡するように表示されることもあります)。
私はNSWindowのは、最初の画面に表示されたときにのみ適用されGitHub
ええ、アプリのライフサイクルのどの時点で、プログラムによってウィンドウのinitialFirstResponderを設定することができるのだろうかと思っていました。ストーリーボードの世界でアプリ、ウィンドウ、ビュー、およびコントローラのライフサイクルをスピードアップするわけではありません。また、それは正しい呼び出しではありません。ドキュメントから: "このメソッドではなく、NSWindow makeFirstResponder:メソッドを使用して、オブジェクトを最初のレスポンダにします。このメソッドを直接呼び出さないでください。" becomeFirstResponderは、firstResponderになることを拒否するために実装できるメソッドビューです。それでも、makeFirstResponderは私にとってはうまくいきません! – Chris
個人的に私はinitまたはviewDidLoad:でそれを呼び出す。どちらの方法でも、コントロール(NSTextFieldなど)が@IBOutletに正しくバインドされていれば、init()ステージまたはviewDidLoad()ステージでself.whateverControl.becoemFirstRsponder()を簡単に呼び出すことができます。ビューの継承が実際に効力を発する前に、いずれかの方法が起こります。 –
makeFirstResponderがviewDidLoadからNOを返す – Chris