0

私は次の状況にあります:

  1. NSTableViewを含む最初のウィンドウ内に1つのカスタムビューがあります。
  2. 最初のウィンドウ内のテーブルビューの選択の背後にある現在のオブジェクトのフォームとして機能する2番目のウィンドウがあります。

詳細:

  • 基本的に2番目のウィンドウを開くNSTableViewにsetDoubleAction:動作を実装しました
  • テーブルビューは、(サブクラス化された)NSArrayControllerのarrangedObjectsにバインドされます
  • 2番目のウィンドウ(ダブルクリックで開く)の特定のインターフェイス要素は、NSArrayControllerの選択にバインドされます
  • NSArrayControllerをサブクラス化し、次の関数を変更しました。

最初に私はaddObjectを変更しました:(またはadd:、これは実際には重要ではありません):

- (void)addObject:(id)object
{
    [super addObject:object];
    [self saveTemplatesToDisk];
}

次に、removeを変更しました。

- (void)remove:(id)sender
{
    [super remove:sender];
    [self saveTemplatesToDisk];
}
  • プリファレンスシートを開くアクションは、1つのライナーです。[NSApp beginSheet:preferenceWindow modalForWindow:[_preferenceView window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
  • ユーザーがリターンキー/OKボタンを押した後に実行されるコードも複雑ではありません。

アレイコントローラの現在のコンテンツをディスクに保存し、2番目のウィンドウを閉じます。

- (IBAction)endPreferenceSheet:(id)sender
{
    [templateArrayController saveTemplatesToDisk];

    [NSApp endSheet:preferenceWindow];
    [preferenceWindow orderOut:nil];
}

最後に、これが私の問題/質問です

2番目のウィンドウでリターンキーを押すと、ウィンドウが閉じ、データが保存され、NSTableViewがそれ以上の操作なしで適切に再ロードされます。しかし、マウスでOKボタンを押しても、何も起こらないようです。ここに興味深い部分があります。2番目のウィンドウが消えた後、最初のウィンドウのテーブルビューで別の行を選択すると、以前に選択した行(読み取り:更新されたオブジェクト)が適切に再読み込みされ、2番目に編集したコンテンツが表示されます選択範囲にバインドされたインターフェイス要素を持つウィンドウ。

基本的に私の実装は機能しますが、ユーザーがマウスを使用してウィンドウを閉じる場合は機能しません。

私が見つけられる唯一の違いはcurrentEventですが、これがこの単純なアプリケーションの動作をどのように変えることができるか想像できません。

  • マウスでOKボタンを押すと:NSEvent: type=LMouseUp loc=(563.055,30.1484) time=58450.2 flags=0 win=0x0 winNum=5371 ctxt=0x0 evNum=8093 click=1 buttonNumber=0 pressure=0 subtype=NSTabletPointEventSubtype deviceID=0 x=19469 y=15838 z=0 buttons=0x0 pressure=0.000000 tilt={0.453108, -0.140629} rotation=0.000000 tangentialPressure=0.000000 vendor1-3=(0, 0, 0)
  • Returnキーを押すと:NSEvent: type=KeyDown loc=(0,300) time=58474.8 flags=0 win=0x0 winNum=5371 ctxt=0x0 chars=" " unmodchars=" " repeat=0 keyCode=36

問題を解決する方法はありますか?

4

1 に答える 1

2

レスポンダー チェーンを思い出してください。キーボード イベントは最初のレスポンダー (フィールド エディター) で始まり、(それが処理されない場合) 次のレスポンダー (テーブル ビュー) に移動します。マウス イベントは、ユーザーがクリックしたビュー (ボタン) に直接移動します。

つまり、テーブル ビューはリターン イベントを処理しますが、マウス イベントは認識しないという違いがあります。ユーザーがクリックすると、ボタンからアクション メッセージが表示されます。テーブル ビューは編集モードのままです。

解決策は、実際のアクションに進む前に、アクション メソッドでコントローラーに編集をコミットするように指示することです。

于 2010-04-03T20:44:22.847 に答える