У меня есть NSTableView
в моем NIB-файле главного окна, в котором используется динамически созданный источник данных, то есть массив словаря создается динамически, когда это необходимо, в одном из моих классов. Поэтому он не связан никакими контроллерами в IB.
В табличном представлении есть 2 столбца с подклассами dataCell.
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
я переписал метод drawInteriorWithFrame:inView:
для обработки всего рисунка (изображений, текста, кнопок и т. Д.) Внутри ячеек таблицы. NSDictionary
для каждого столбца содержит строку (столбец 1) и ссылку на объект для (столбец 2).
На основе примера 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 раз больше, чем должно быть.
Вторая проблема, возникшая совсем недавно, заключается в том, что если вы заметите идентификаторы объектов выше, вы увидите, что они отличаются. Если я добавляю 1 элемент к источнику данных, когда я вызываю [self objectValue]
, если таблица перерисовывается, идентификаторы объекта должны быть такими же, как и ссылка, т.е. объект уже -alloc
в предыдущем классе, и я просто отправляю ссылку на объект.
Надеюсь, это имеет смысл, но я бьюсь головой в течение последнего дня, пытаясь понять, не ошибаюсь ли я в чём-либо, и не могу найти никаких проблем. Если вам нужно больше кода, дайте мне знать. Я тоже пробовал Google и получил только ссылку на это:
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>