4

いくつかのカスタムNSTableViewサブクラスで満たされたカスタム サブクラスがありNSTextFieldCellます。矢印キーを使用して編集したセルを変更できるようにしたいと考えています。

カスタム フィールド エディターを作成し (サブクラス化NSTextViewして)、次のようにウィンドウ デリゲートから返すことで、これを実現できます。

- (id) windowWillReturnFieldEditor:(NSWindow *) aWindow toObject:(id) anObject {
    if ([anObject isEqual:myCustomTable]) {
        if (!myCustomFieldEditor) {
            myCustomFieldEditor = [[MyNSTextViewSubclass alloc] init];
            [myCustomFieldEditor setTable:anObject];
        }
        return myCustomFieldEditor;
    }
    else {
        return nil;
    }
}

では、、、、およびメソッドをオーバーライドして目的の機能を実装しましたが、すべて正常に動作しますMyNSTextViewSubclass。唯一の問題は、フィールド エディターがテキスト フィールド セル エディターのように動作しなくなったことです。たとえば、Enter キーを押すと、編集を終了する代わりにテキスト フィールドに改行が挿入されます。moveUp:moveDown:moveLeft:moveRight:

デフォルトのものとまったく同じように応答するカスタム フィールド エディターを作成するにはどうすればよいですかNSTextFieldCell(オーバーライドする 4 つの関数を除く)。moveUp:または、 、moveDown:moveLeft:、およびの機能を変更するより良い方法はありmoveRight:ますか?

編集:テキスト フィールドが編集用に選択されると、フィールド エディターがテキスト フィールドをデリゲートとして設定するようです。その場合、ここcontrol:textView:doCommandBySelector:で説明されているようにデリゲート メソッドにアタッチするだけで役立つ場合がありますが、サブクラスまたはサブクラスでその関数を実装すると、呼び出されません。なぜだめですか?NSTextFieldCellNSTableView

4

5 に答える 5

4

私はほぼ一日中この問題に費やしましたが、ついにそれを理解しました。矢印キーを使用してNSTableViewサブクラスをトラバースできるようにするには、NSTableViewに次のメソッドを追加する必要がありました。

- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
    if(aSelector == @selector(moveUp:)) {
        [self moveSelectionToPreviousRow];
        return YES;
    } else if(aSelector == @selector(moveDown:)) {
        [self moveSelectionToNextRow];
        return YES;
    } else if(aSelector == @selector(moveLeft:)) {
        [self moveSelectionToPreviousColumn];
        return YES;
    } else if(aSelector == @selector(moveRight:)) {
        [self moveSelectionToNextColumn];
        return YES;
    }
    return NO;
}

これは、デフォルトのフィールドエディタがNSTextView(NSControlではない)であるため、<NSTextViewDelegate>プロトコルを使用する必要があったためです。デリゲートとして設定されるビューはNSTableViewであり、NSTextFieldCellではありません。関数は、NSTableViewサブクラスで定義されたmoveSelectionTo...カスタム関数であり、現在編集されているセルを追跡し、それに応じてセルを移動します。

于 2010-07-01T21:38:40.173 に答える
1

Appleのドキュメントに関連している可能性のあるエントリ:

setFieldEditor:

受信者のレイアウトマネージャーを共有するテキストビューがフィールドエディターとして動作するかどうかを制御します。

- (void)setFieldEditor:(BOOL)flag

パラメーター

フラグYESレシーバーのレイアウトマネージャーを共有するテキストビューがフィールドエディターとして動作するようにします。それ以外のNO場合。

討論

フィールドエディターは、Tab、Shift-Tab、およびReturn(Enter)を、編集を終了し、場合によってはファーストレスポンダーを変更するための手がかりとして解釈します。非フィールドエディタは、代わりにこれらの文字をテキスト入力として受け入れます。フィールドエディタの詳細については、「テキストフィールド、テキストビュー、およびフィールドエディタ」を参照してください。デフォルトでは、テキストビューはフィールドエディタとして動作しません。

于 2012-07-24T08:34:52.430 に答える
0

必要なことを達成する最も簡単な方法control:textView:doCommandBySelector:は、テーブル ビューのデリゲートに実装することです。

こちらの同様の質問に対する私の回答も参照してください: Arrow keys with NSTableView

于 2015-06-17T06:55:40.733 に答える
-1

keyDown:(NSEvent *)eventこれらは、サブクラス化されたオブジェクトのメソッドでオーバーライドする必要がありNSTextFieldCellます。押されたキー (矢印の 1 つ) を確認し、それ以外の場合は まで呼び出しますsuper

于 2010-07-01T17:04:06.183 に答える