0

メインウィンドウにNSTableView、動的に作成されたデータソースを使用するNIBファイルがあります。つまり、必要に応じて辞書の配列が動的に作成されます。したがって、IBのどのコントローラーにも拘束されません。

テーブルビューには、dataCellのセットをサブクラス化した2つの列があります。

NSTableColumn *detailsColumn = [[tableView tableColumns] objectAtIndex:0];
imageColumnCell *fileDetails = [[[imageColumnCell alloc] init] autorelease];
[detailsColumn setDataCell:fileDetails];
[fileDetails setNumberOfUploads:numberOfFiles];

NSTableColumn *cancelColumn = [[tableView tableColumns] objectAtIndex:1];
cancelButtonCell *cancelCell = [[[cancelButtonCell alloc] init] autorelease];
[cancelColumn setDataCell:cancelCell];

<NSTableViewDataSource>ファイルでは、numberOfRowsInTableView:は動的に作成された配列の正しいカウントに設定され、GDBはテーブルが描画されたときにそれを正しくログに記録します。

ここで問題が発生します。架空の理由で、データソースの配列数が1であるとします。

サブクラス化された両方で、テーブルセル内のすべての描画(画像、テキスト、ボタンなど)を処理NSCellするメソッドを上書きしました。for each列には、文字列(列1)と(列2)のオブジェクト参照が含まれますdrawInteriorWithFrame:inView:NSDictionary

データソース内の1つのオブジェクトの例に基づいてdrawInteriorWithFrame:inView:、次のように記述した場合(列2):

NSLog(@"drawInteriorWithFrame: in cancelButtonCell - %@", [self objectValue]);

GDBで期待される結果(テーブルをクリックしたりスクロールしたりすることなく)は、次の1つのインスタンスである必要があります。

[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123456>

また、テーブルをクリックまたはスクロールすると、テーブルビュー内の各アクションに対して同じ値が返されるはずです。ただし、最初のロードでは、次のようなものが表示されます。

[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123af06>
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x12b3236>

結果が2つある場合は、3つのログ項目を取得し、それ以外の場合は4つを取得します。ほとんどの場合、メソッドは本来より1回多く呼び出されます。

2つ目の問題は、最近発生したばかりですが、上記のオブジェクトIDに気付くと、それらが異なっていることがわかります。データソースに1つのアイテムを追加した[self objectValue]場合、呼び出したときにテーブルが再描画された場合、オブジェクトIDは参照であるため、同じである必要があります。オブジェクトは前のクラスですでに-alloc'dされており、オブジェクト参照を送信しているだけです。

これが理にかなっていることを願っていますが、私は最後の日、どこかで誤って何かを複製していて問題が見つからないかどうかを確認しようと頭を悩ませてきました。さらにコードが必要な場合はお知らせください。私もグーグルを試しましたが、これへの参照しかありません:

http://forum.soft32.com/mac/NSPopUpButtonCell-view-refresh-ftopict46690.html

前もって感謝します。

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

  NSString *columnIdentifier = [tableColumn identifier]; 
  NSDictionary *theDict = [fileSourceArray objectAtIndex:row];

  MyAppMethods *appMethods = [MyAppMethods alloc];
  if([appMethods getIsComplete:self])
    return nil;

  if([columnIdentifier isEqualToString:@"fileCancel"]){
    if([[theDict objectForKey:columnIdentifier] isKindOfClass:[ASIFormDataRequest class]]){
      ASIFormDataRequest *fileUploadRequest = [theDict objectForKey:columnIdentifier];
      NSLog(@"in tableView:objectValueForTableColumn:row %@", fileUploadRequest);
      return fileUploadRequest;
    }
  }
  return [theDict objectForKey:columnIdentifier];
}

以下の議論のための追加の出力。

GDBからの出力

** 1つのファイル、1つのNSCellセット、およびサブクラス化** ここでは、要求は同じままです-(つまり、コピーなし)

[6619:903] <ASIFormDataRequest: 0x10ca9b0>
[6619:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x10ca9b0>
[6619:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x10ca9b0>

1つのファイル、2つのNSCellのセットおよびサブクラス化

ここで、リクエストはサブクラスで変更されます-(つまり、コピーなし)

[6652:903] <ASIFormDataRequest: 0x103b390>
[6652:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x103b390>
[6652:903] cancelButtonCell.m in - (void)drawInteriorWithFrame:inView: <ASIFormDataRequest: 0x1221b00>
[6652:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x103b390>
[6652:903] cancelButtonCell.m in - (void)drawInteriorWithFrame:inView: <ASIFormDataRequest: 0x1227100>
4

1 に答える 1

0

正しく表示されていれば問題ないと思います。テーブル ビューは、図面を完成させる前に、そのテーブル列に「ダミー」セルを要求します。それが余分な-draw...呼び出しの原因だと思います。また、セルは設定時にオブジェクト値をコピーするため、明らかに新しいアドレスが与えられます。

ログメッセージの投稿に応じて:

これらのログがいつ投稿され、何を表示しているのかについては 100% 明確ではありませんが、私が予想しているように見えます。では、辞書tableView:objectValueForTableColumn:row:にある値を出力しています。これは元の値と同じです。では、セルの を印刷しています。これは、元のコピー (つまり、メモリ内のアドレスが異なる新しいオブジェクト) です。ASIFormDataRequestdrawInteriorWithFrame:inView:objectValue

于 2011-04-19T19:23:32.477 に答える