0

私はココア初心者です。テキスト列を持つNSTableViewと、選択した行のテキストを表示するプレビューNSTextViewフィールドを含むcocoaアプリケーションがあります。

  1. バインディングを使用していません
  2. デリゲートとdataSourceが適切に設定されている
  3. テーブルはMyObjectのNSMutableArrayを使用します

これで、行を正常に追加または削除できます。選択を変更すると、対応する選択されたテキストがUITextViewに表示されます。

問題:NSTextViewを使用して行/列のいずれかの値を変更/編集するとすぐに、NSTableViewがNSMutableArrayを妨害し、誤ったデータを表示します。その後、選択を変更すると、テーブルビューにさまざまな状態が表示されます。添付のスクリーンショットを参照してください。

状態1:(入力されたデータの表示)

状態1

状態2:(行の選択が変更されました)

状態2

状態3:(行の選択が変更されました)

状態3

状態4:(値を編集しようとしています!)

状態4

状態5:(ハイライト/行#1の選択)

状態5

状態6:(ハイライト/行#2の選択)

状態6

UITextViewから更新された値を取得するために、次のメソッドを使用しています。

- (void)textDidEndEditing:(NSNotification *)notification {
    id sender = [notification object];
    NSString * theString = [sender string];

    NSInteger selectedRow = [_myTableView selectedRow];

    if (selectedRow < 0 || selectedRow > [_myArray count] - 1) return;

    MyObject *rowObject = [_myArray objectAtIndex:selectedRow];
    rowObject.text = theString;

    // Update table
    [_myTableView reloadData];
}

NSTableViewで明らかなリロードバグの回避策を実装しようとしましたが、これは機能しません。

- (void)tableViewSelectionIsChanging:(NSNotification *)notification {

    if ([notification object] == _myTableView) {
        [_myTableView noteNumberOfRowsChanged];
    }
}

問題の原因を特定するための助けに感謝します。

4

1 に答える 1

0

数え切れないほどの時間を無駄にした後、私はついに問題を解決することができました。textDidEndEditing:メソッドに加えられた変更は次のとおりです。

- (void)textDidEndEditing:(NSNotification *)notification {
    id sender = [notification object];
    NSString * theString = [sender string];

    NSInteger selectedRow = [_myTableView selectedRow];

    if (selectedRow < 0 || selectedRow > [_myArray count] - 1) return;

    MyObject *rowObject = [_myArray objectAtIndex:selectedRow];

    // Problematic!
    // rowObject.text = theString;

    // Working!
    rowObject.text = [NSString stringWithString:theString];

    // Update table
    [_myTableView reloadData];
}
于 2011-08-24T04:02:12.310 に答える