7

3つのテキストフィールドを持つ単純なフォーム(NSWindow)があります。NSWindowinitialFirstResponderは、最初のフィールド()を「指し示しています」NSTextField。3つのテキストフィールドはすべて、を介して相互に循環的にリンクされていnextKeyViewます。

私が抱えている問題は、Xcodeからアプリケーションを起動すると、アプリケーションが閉じられたときに最後にアクティブだった(フォーカスされている)テキストフィールドにフォーカスされることです。

たとえば、テキストフィールドにA、B、Cという名前を付け、AにinitialFirstResponder設定した場合、アプリケーションを起動してBにフォーカスし、アプリケーションを閉じると、次に起動したときにBにフォーカスが移ります。

それはなぜですか、そしてどのようにこれを修正しますか?

(これが些細な質問である場合は申し訳ありませんが、これらはココアでの私の最初のステップです...)

編集:

これはOSXLion 10.7.1、Xcode4.1にあります。

編集2:

これを「修正」する方法を見つけました...メインウィンドウ(またはそれに関する任意のウィンドウ)XIB / NIBファイルで、[属性インスペクター]をクリックし、[復元可能]チェックボックスをオフにします。これで、アプリケーションは最後の位置を保存しないため、initialFirstResponderシーイングが尊重され、それに応じてフォローされます。

4

2 に答える 2

7

ココアへようこそ!:) これは、OS X Lionの新しいユーザー インターフェイス保持機能の一部として発生していると思われます。(実際、3 つのテキスト フィールドを持つ単純なアプリを作成したところ、この動作も見られます。) Windows は自動的に復元されるため、実装していなくても、この動作の多くが自動的に発生することがわかります。これはおそらく望ましいことです — ほとんどのアプリケーションはこのように動作し、ユーザーはそれを期待するようになります。

ただし、本当に無効にしたい場合は、おそらく NSWindow またはおそらく NSTextField をサブクラス化し、-encodeRestorableStateWithCoder:. ただし、デフォルトの動作をそのままにしておくことをお勧めします。


もう少し情報を編集してください。アプリの状態はに保存されているようです~/Library/Saved Application State/com.yourapp.savedState。そこには、ウィンドウに関する情報を含む plist ファイルがあります。他のファイルは簡単に読めるようには見えませんが、おそらくどのフィールドが最初の応答者であるかなどの情報が含まれています。

于 2011-08-23T08:08:03.387 に答える
0

このスレッドはほぼ 10 年前のものですが、回答を追加します。jbandes OS X 10.7 Lion からの回答が発表されてから約 1 か月後です。

からの引用に続いてNSWindowRestoration.h

@interface NSWindow (NSUserInterfaceRestoration)

/* Determines whether the window should be restored on relaunch.  By default, windows with NSTitledWindowMask set in the styleMask are restorable, and windows without it set are not.
 */
@property (getter=isRestorable) BOOL restorable API_AVAILABLE(macos(10.7));
于 2020-04-25T14:00:13.270 に答える