Обновление источника данных Target Action для NSTableView на основе представления

У меня есть ситуация, когда я использую представления таблиц на основе представлений и не хочу использовать привязки между источником данных и представлением таблицы. В основном это связано с тем, что мой NSTableCellView может иметь несколько подпредставлений, сложную проверку и триггерные вызовы методов в других объектах.

У нас есть очень четкий путь обновления NSTableView с источником данных с помощью:

tableView:viewForTableColumn:row:

Однако в обратном направлении, то есть обновление источника данных с обновлениями в NSTableView, у нас нет ничего такого, что мы имеем для представлений таблиц на основе ячеек:

tableView:setObjectValue:forTableColumn:row:

Вместо этого предлагается шаблон Target Action. Итак, у меня есть в основном 2 вопроса:

  1. Если я устанавливаю цель и действие для одного конкретного представления или его подпредставления, как мне получить правильную информацию о строке и столбце, чтобы узнать, что нужно обновить в источнике данных?

Должны ли clickedRow и clickedColumn из NSTableView сработать, хотя я отредактировал или изменил один объект подпредставления?

  1. Как я могу информировать цель (как другой объект, а не экземпляр NSTableView) о строке и столбце, если действие будет передавать, например, NSTextField в качестве параметра?

В основном я могу перейти к clickedColumn и clickedRow (если эти 2 свойства являются правильным ответом на первый вопрос) через дерево подвидов, но я нахожу это довольно неэлегантным решением и подозреваю, что есть лучший способ....

Заранее спасибо....


person mbpro    schedule 27.10.2011    source источник


Ответы (2)


NSTableCellView имеет objectValue. Предположительно, вы уже установили его, поэтому действие может использовать [(NSTableCellView *)[sender superview] objectValue], чтобы узнать, с каким объектом ему нужно манипулировать.

Я предлагаю вам также создать подкласс NSTableCellView и реализовать действие там. Если вам нужен доступ к другим частям модели, вы можете добавить выход для вашего контроллера представления.

Если вам действительно нужен номер строки, вы можете вызвать indexOfObject в своем массиве содержимого.

person paulmelnikow    schedule 29.10.2011
comment
Да, я намерен создать подкласс NSTableCellView, и весьма вероятно, что мои методы действий будут в некоторых других классах. Итак, я предполагаю, что что-то вроде [[[(NSTableCellView *)[sender superview] objectValue] superview] clickedRow] может дать мне позицию строки, по которой щелкнули, и аналогичную для столбца, по которому щелкнули? - person mbpro; 30.10.2011
comment
Это должно сработать. Чтобы сделать его чище, задайте свои пользовательские свойства ячеек для номеров строк и столбцов и установите значения в tableView:viewForTableColumn:row:. - person paulmelnikow; 31.10.2011

Два метода NSTableView rowForView и columnForView должны помочь. Вы можете вызывать их с помощью отправителя метода Target/Action, например, срабатывающего с помощью NSButton в вашем TableView (это нормально, если он находится где-то в подвиде). ​​Или вы можете вызывать эти методы из реализации метода делегата, например textDidChange из NSTextDelegate. Таким образом, вы можете легко обновить соответствующий массив. Если вы не хотите непрерывных обновлений, textDidEndEditing также сделает эту работу.

- (void)textDidChange:(NSNotification *)notification
{
    NSTextView *tv = [notification object];
    int r = [tableView rowForView:tv];
    int c = [tableView columnForView:tv];
    NSLog(@"Row: %d Column: %d", r, c);
    // updating code here
}
person Heiko    schedule 14.03.2012