Как я могу получить уведомление, когда пользователь заканчивает редактирование ячейки в NSTableView? - PullRequest
5 голосов
/ 11 октября 2008

Мне нужно знать, когда пользователь заканчивает редактирование ячейки в NSTableView. Таблица содержит все пользовательские календари (полученные из CalCalendarStore), поэтому для сохранения изменений пользователя мне нужно сообщить об этом CalCalendarStore. Однако я не могу найти ничего, что вызывается после того, как пользователь заканчивает редактирование - я предполагаю, что в делегате таблицы будет метод, но я видел только один метод, который вызывается при начале редактирования, а не при завершении редактирования.

Ответы [ 7 ]

14 голосов
/ 26 августа 2012

Вы можете достичь того же результата, не используя подклассы NSTableView, используя NSNotificationCenter или методы NSControl. См. Документацию Apple здесь:

http://developer.apple.com/library/mac/#qa/qa1551/_index.html

Это всего лишь пара строк кода и отлично сработало для меня.


Если вы можете быть delegate из NSTableView, вам просто нужно реализовать метод

- (void)controlTextDidEndEditing:(NSNotification *)obj { ... }

Фактически, NSTableView - это delegate из NSControl элементов, которые он содержит, и перенаправляет эти вызовы методов на его delegate (есть и другие полезные методы)

В противном случае используйте NSNotificationCenter:

// where you instantiate the table view
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:)
    name:NSControlTextDidEndEditingNotification object:nil];

// somewhere else in the .m file
- (void)editingDidEnd:(NSNotification *)notification { ... }

// remove the observer in the dealloc
- (void)dealloc {
   [[NSNotificationCenter defaultCenter] removeObserver:self
    name:NSControlTextDidEndEditingNotification object:nil];
   [super dealloc]
}
2 голосов
/ 12 октября 2008

Подкласс NSTableView и переопределение textDidEndEditing: (обязательно вызовите реализацию super).

Это будет вызываться только текстовыми полями NSTextFieldCell или NSComboBoxCell (но только при изменении значения путем его ввода, а не путем выбора значения в меню со списком).

2 голосов
/ 12 октября 2008

Настройка наблюдателей для каждого элемента в массиве содержимого с использованием addObserver: toObjectsAtIndexes: forKeyPath: options: context:

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

В качестве примера рассмотрим проект iSpend .

1 голос
/ 11 октября 2008

Это не работает в моем случае. Я установил свой класс контроллера как DataSource для таблицы, но метод никогда не вызывался. Данные моей таблицы привязаны к значениям в NSArrayController - может ли это быть причиной того, что мой объект не был вызван?

1 голос
/ 11 октября 2008

Посмотрите на протокол NSTableDataSource. Требуемое сообщение называется: tableView: setObjectValue: forTableColumn: row:

0 голосов
/ 07 сентября 2017

Перевод ответа @ Милли на Свифт 3 :

// Setup editing completion notifications
NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil)

Функция для обработки уведомлений:

func editingDidEnd(_ obj: Notification) {
    guard let newName = (obj.object as? NSTextField)?.stringValue else {
        return
    }

    // post editing logic goes here
}
0 голосов
/ 12 октября 2008

Подкласс NSArrayController и переопределение objectDidEndEditing: (обязательно вызовите реализацию super).

В основном это будет вызываться только текстовыми полями NSTextFieldCell или NSComboBoxCell (но только при изменении значения путем его ввода, а не путем выбора значения в меню со списком). Может быть несколько других ячеек, которые будут вызывать его, но я не уверен, какие именно. Если у вас есть пользовательская ячейка, рассмотрите возможность реализации неформальных протоколов NSEditor и NSEditorRegistration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...