0

NSTableCellView (またはそのサブクラス) を NSTableView から手動で削除するにはどうすればよいですか?

情報を保持している配列を空にし、新しい情報のために DB をキューに入れ、テーブル データをリロードすると、新しい配列リストにあるものと同様のインデックス値でセルのみが更新されます。

元。

最初に配列に 8 つのオブジェクトがあり、それらは正常に表示されます。配列を更新して 3 つしかない場合、テーブルの上位 3 つのセルが更新されますが、最後の 5 つは古いセルのままです。古いものは選択できず、表示されるだけです。そして、私はいくつかの再描画/割り当て解除を見逃していると思います..

TableView で setNeedsDisplay を試しましたが、まだ運がありません。

ARC、Xcode 4.6.1、および OS X 10.8.3 を使用しています

サンプルコード

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {

     return [_array count];
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

     [_tableView setNeedsDisplay];

     NSDictionary *d = [_array objectAtIndex:row];
     NSString *identifier = [tableColumn identifier];

     if ([identifier isEqualToString:@"MainCell"]) {

         CustomCellView *cellView = [tableView makeViewWithIdentifier:@"MainCell" owner:self];
         [cellView.textField setStringValue:d[@"from"]];
         [cellView.subject setStringValue:d[@"subject"]];
         [cellView.text setStringValue:d[@"text"]];
         [cellView.date setStringValue:d[@"date"]];

         return cellView;
     }

     return nil;
}
4

3 に答える 3

1

NSTableView に指示する必要reloadDataがあります (そうしているように聞こえます)。その場合、データ ソースは、行が 3 つしかないことを認識し、その答えを返すのがnumberOfRowsInTableView:仕事です (そうしていないように思えます)。コードは表示されません (なぜ表示れないのですか?)。

于 2013-03-25T22:36:12.073 に答える
0

使用する

[tableView removeRowsAtIndexSet:indexSet withAnimation:YES];
于 2013-03-26T12:52:01.290 に答える
0

次の例では、cellView を (クリア/更新/再描画) できます。

  1. 元のフレームと同じフレームで新しいセルを作成します。
  2. 元のフレームと同じフレームで再描画します。
  3. その中に元のオブジェクトを入れます。

この例では、「mainTable」はテーブルの NSTableView* です。

- (NSView *)tableView:(NSTableView *)aTableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    NSString* identifier = [tableColumn identifier];
    NSTableCellView* cellView = [[NSTableCellView new] initWithFrame:[[mainTable makeViewWithIdentifier:identifier owner:self] frame]];

    [cellView drawRect:[[mainTable makeViewWithIdentifier:identifier owner:self] frame]];
    cellView = [mainTable makeViewWithIdentifier:identifier owner:self];

    // do something with your cellView here ...

    return cellView;
}
于 2014-04-26T12:04:06.693 に答える