Какао: действия вперед (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 и верните то, что он возвращает.

Другие вопросы по тегам