メインウィンドウに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>