2

私は現在、内部に NSTextFields を持つセルビューを含むテーブルビューを持っています。現在、行選択時に、セル ビューのファーストレスポンダー ステータスで NSTextView を許可することを期待して、セル ビューに次のメッセージを送信しています。

- (void)notifyOfSelectionInWindow:(NSWindow *)window {
    [[self textField] setEditable:YES];
    [[self textField] setSelectable:YES];
    // make textField (textView) first responder
    [[self textField] selectText:nil];
    [[[self textField] currentEditor] setSelectedRange:NSMakeRange([[[self textField] stringValue] length], 0)];      
}

行が選択されていないときに NSTextFields を編集可能にしたくないので、カスタム NSTextField サブクラスでもこれを行います。

- (void)textDidEndEditing:(NSNotification *)notification {
    [self setEditable:NO];
    [self setSelectable:NO];
    [super textDidEndEditing:notification];
}

選択更新コード: (ここで行の高さも変更していることに注意してください)

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
    // get the table veiw to animate/recalculate height of row
    NSMutableIndexSet *changedRows = [NSMutableIndexSet indexSet];
    [changedRows addIndex:row];
    [changedRows addIndex:[tableView selectedRow]];
    [tableView noteHeightOfRowsWithIndexesChanged:changedRows];
    [rowView notifyOfSelectionInWindow:[self window]]; 
    // ^ this in turn calls a method of the same name of the corresponding cell view
    return YES;
}

問題は、これが半分の時間しか機能しないことです。初めて行を選択しようとすると、最初のレスポンダーのステータスがテーブル ビューに戻ります。2 回目は完全に機能し、テキスト フィールドにフォーカスがあります。3回目でまた壊れる。4番目 - 完璧です!奇妙な理由で、コードは1回おきにしか機能しません...

なぜこれがそうなのか、誰にも分かりますか?啓発的なフィードバックは大歓迎です。

4

1 に答える 1

2

tableView で textField から textField に切り替えると、予期しない順序でイベントが呼び出されます (考えない限り)。

ここでの問題は、デリゲート メソッドが呼び出される順序です。

textField1 から textField2 に移動するとします。

textField1 がすでにアクティブで、textField2 をクリックすると、次のように呼び出されます。

textShouldBeginEditing  (textField2)
textShouldEndEditing    (textField1)
textDidEndEditing       (textField1)
textDidBeginEditing     (textField2)

textShouldBeginEditing前に呼び出されるためtextDidEndEditing(古い行を放棄する前に行を選択できるself.textFieldようにする必要があるため)、代わりにinを更新する必要がありますtextDidBeginEditing

于 2012-04-07T03:58:30.863 に答える