Обновление источника данных Target Action для представления на основе NSTableView - PullRequest
1 голос
/ 27 октября 2011

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

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

tableView:viewForTableColumn:row:

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

tableView:setObjectValue:forTableColumn:row:

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

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

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

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

1 голос
/ 15 марта 2012

Два метода NSTableView rowForView и columnForView должны сделать свое дело. Вы можете вызвать их с отправителем метода Target / Action, подобного тому, который вызывается NSButton в вашем TableView (это нормально, чтобы иметь его где-то в subwiew) Или вы можете вызывать эти методы из реализации метода делегата, например 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...