наследование NSCell - [self objectValue] с drawInteriorWithFrame: inView: возвращает странные результаты - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть 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>

1 Ответ

0 голосов
/ 19 апреля 2011

Не думаю, что есть о чем беспокоиться, если он отображается правильно.Табличное представление запрашивает свои столбцы таблицы для "фиктивных" ячеек прежде, чем закончить их рисунок;Я подозреваю, что это причина дополнительного -draw... звонка.Кроме того, ячейка копирует значение своего объекта при настройке, так что это, очевидно, даст ему новый адрес.

В ответ на ваше сообщение журнала:

I 'Я не уверен на 100%, когда именно эти журналы публикуются и что они отображают, но это похоже на то, что я ожидал увидеть.В tableView:objectValueForTableColumn:row: вы печатаете значение, которое у вас есть в вашем словаре , которое совпадает с исходным ASIFormDataRequestdrawInteriorWithFrame:inView: вы печатаете ячейку objectValue, которая является копией этого оригинала (т. Е. Нового объекта с другим адресом в памяти).

...