1

さて、私はこの質問に欠けている明らかな何かがあるように感じます。コード全体でmakeFirstResponderを使用して、textField 1から2、2、3などに移動しました。これは希望どおりに機能しているようですが、新しいビューが読み込まれるときに、カーソルをtextField1に置きます。ただし、次のコードは、ロード時にカーソルをtextField1に配置しません。

- (void) awakeFromNib{
    [[[self view] window] makeFirstResponder:textField1];
}

setInitialFirstResponderも試しましたが、効果はありませんでした(それが正しいとは思いません)。それは、awakeFromNibメソッドに含まれているためですか。誰かが私が欠けているものを教えてもらえますか?前もって感謝します。

編集-私の解決策は受け入れられた答えとわずかに異なっていたので、私は自分の実装を投稿すると思いました。最初のレスポンダーを設定したいビューは後で追加されたサブビューであったため(アプリケーションウィザードの2番目の画面を考えてください)、単にsetCursorToFirstTextFieldメソッドを追加しました。

- (void) setCursorToFirstTextField {
[[[self view] window] makeFirstResponder:textField1];
}

また、元のウィンドウのカスタムビューにサブビューを追加した後で、必ず呼び出してください。

4

1 に答える 1

1

はい、あなたはawakeFromNibのメソッドの場所に問題があることについて正しいです。[self.view window]をawakeFromNibに記録すると、NULLであることがわかります。正確に設定されているかどうかはわかりませんが、(これがWizardControllerの質問に関連している場合は)別のクラスでalloc initWithNibName:bundle:を実行して、ViewControllerを作成してから追加していると思います。ビュー階層に対するコントローラーのビュー。そこにいくつかのログをスローすると、コントローラークラスのawakeFromNibが、alloc initの後、ビューがサブビューとして追加される前に呼び出されることが示されるため、その時点ではウィンドウはありません。この問題を回避する方法は、View Controllerクラスに(makeFirstResponderコードを含む)セットアップメソッドを作成することでした。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.wizard = [[WizardController alloc] initWithNibName:@"WizardController" bundle:nil];
    [self.window.contentView addSubview:wizard.view];
    [self.wizard doSetup];
}
于 2012-06-07T03:40:08.447 に答える