2009-04-06 19 views
2

Mac OS X Cocoaアプリケーションでは、Shared User Defaults Controllerにバインドされたテキストフィールドを持つアプリケーションモーダルダイアログがあります。テキストフィールドを編集してから、OKボタンを押す前にタブをタップすると、すべてが正常に機能します。しかし、フィールドの編集を開始してReturnキーを押してOKをトリガーすると、フィールドの古い値はNSUserDefaultsに残ります。ココアでモーダルダイアログを閉じる前にテキストフィールドを強制的に読み取る

したがって、編集が「不完全」である場合、変更されたフィールドがバウンド値に影響するようにするにはどうすればよいですか?

ドキュメントをよく読んでから、ダイアログを閉じる前に各テキストフィールドに対してNSControlのvalidateEditingメソッドを呼び出すことができると思いますが、もっと簡単な方法が必要です。

- (IBAction)startTimerDialogStartButtonWasClicked:(id)sender { 
    [self closeModalDialog:sender]; 

    // Then, call methods that read values from NSUserDefaults 
    // ...  
} 

答えて

4

ユーザーデフォルトコントローラa commitEditingメッセージを送信します。

0

あなたが設定してみてください可能性:このメソッドに標的化され

- (void)showDialog { 
    [NSApp activateIgnoringOtherApps:YES]; 
    [NSApp beginSheet:startTimerDialog 
     modalForWindow:nil 
     modalDelegate:nil 
     didEndSelector:nil 
      contextInfo:nil]; 
    [NSApp runModalForWindow:startTimerDialog]; 
    [NSApp endSheet:startTimerDialog]; 
    [startTimerDialog orderOut:self]; 
} 

(実際には、 "スタート" と題し)OKボタン:

FWIWは、ここにダイアログを表示するコードですすべてのテキストフィールドにdelegateを追加し、その変更を直接処理します。

+0

処理しようとしている場合に代理人が通知を受け取るのですか? –

2

これが答えかもしれません:

[startTimerDialog makeFirstResponder:nil]; 

ドキュメントによると、これは現在の編集を終了させなければならない最初の応答者、あるものは何でもresignFirstResponderを送信します。

もちろん、最初のレスポンダは辞退を拒否することができます。その場合、makeFirstResponderはNOを返します。だから私はそれをどう扱うかを調べる必要がある。

1

A編集を終了するには少し唐突な方法は、次の呼び出しで実現することができます。

[startTimerDialog endEditingFor:nil]; 

これは常に動作しますが、それは少しより強いあなたは、ほとんどの時間が必要になりますよりも、です。 (「強烈」のより公式な記述については、下記のドキュメントのリンクを参照してください)

簡潔に:-endEditingFor:は、fieldEditorが最初のレスポンダを辞任できない場合の最後の手段としてのみ使用してください。このような極端な手段に頼る前に、より微妙なアプローチを試してみてください。

-endEditingForためNSWindow class documentationに、より微妙であるために: Appleはこの似た何かを提案している:

if (![startTimerDialog makeFirstResponder:startTimerDialog]) 
    /* Making the window firstResponder failed, proceed to 
     force the first responder to resign */ 

    [startTimerDialog endEditingFor:nil]; 

が自分の正確なコード例を参照するには、上記のリンクに従ってくださいをあなたがしているので、私はここでそれを短縮しましたあなたの説明されたユースケースでこの後にfieldEditorを使用することには興味がありません。

関連する問題