Какао: действия вперед (copy:, paste: etc.) до цепочки респондента
У меня есть подкласс NSOutlineView
который реализует copy:
, paste:
, cut:
и т. д. Также NSDocument
Подкласс реализует эти же методы.
Когда представление структуры находится в цепочке респондента (является первым респондентом или родительским представлением), все события копирования / вставки перехватываются NSOutlineView
подкласс. Что я хочу, так это в зависимости от контекста перехватить некоторые из этих сообщений или позволить им распространяться и быть пойманным NSDocument
подкласс.
Что я хочу в основном:
- (void)copy:(id)sender
{
// If copy paste is enabled
if ([self isCopyPasteEnabled]) {
[[NSPasteboard generalPasteboard] clearContents];
[[NSPasteboard generalPasteboard] writeObjects:self.selectedItems];
return;
}
// If copy paste is disabled
// ... forward copy: message to the next responder,
// up to the NSDocument or whatever
}
Я уже перепробовал много хитростей, но ни один из них не был успешным:
[[self nextResponder] copy:sender]
это не работает, потому что следующий респондент может не реализоватьcopy:
[super copy:sender]
то же самое здесь, супер не реализуетcopy:
[NSApp sendAction:anAction to:nil from:sender]
Это хорошо, чтобы отправить действие первому ответчику. Если используется внутри действия
Конечно, я мог бы вручную зациклить цепочку респондента, пока не найду что-то, что отвечает copy:
или даже напрямую позвонить copy:
на текущий документ, но я ищу правильный способ сделать это.
Спасибо заранее!
1 ответ
Это должно работать:
[[self nextResponder] tryToPerform:_cmd with:sender];
Однако есть проблема: присутствие респондента в цепочке респондента, который реализует -copy:
сам по себе вызовет включение пункта меню "Копировать", даже если это не было бы иначе, если бы ваш объект не был в цепочке или не реализован -copy:
, Ваш объект может отключить этот элемент, используя -validateMenuItem:
или же -validateUserInterfaceItem:
, но включить его будет нетривиально тогда и только тогда, когда в цепочке есть другая потенциальная цель, и эта цель активирует элемент.
Другой подход заключается в том, чтобы просто выполнить поиск респондента, который реализует метод действия, пропустить ваш контурный вид, если вы отключите поддержку монтажного стола. Override -respondsToSelector:
, Если селектор является одной из операций с монтажной панелью, и ваша поддержка монтажной панели отключена, верните false, даже если ваш класс действительно ее реализует. То есть лгать и утверждать, что ваш объект просто не реагирует на эти селекторы. Для любого другого селектора, или если ваша поддержка картона включена, позвоните в super и верните то, что он возвращает.