Это то, что цепочка ответчиков предназначена для.
Поскольку вы используете NSCollectionView
, у вас, вероятно, уже есть подкласс NSCollectionViewItem
. Если нет, создайте его. Реализуйте свой метод действия в этом подклассе. Пример:
class DocumentItem: NSCollectionViewItem {
var document: MyDocument? {
return representedObject as? MyDocument
}
@IBAction func doThatThing(sender: AnyObject?) {
Swift.print("This is where I do that thing to \(document)")
}
// @IBOutlets and whatnot here...
}
Возможно, вам придется установить это как пользовательский класс вашего NSCollectionViewItem
в вашем xib или раскадровке.
Затем, если представление вашей ячейки (представление, принадлежащее вашему NSCollectionViewItem
) еще не является настраиваемым подклассом NSView
, вы должны сделать его настраиваемым подклассом. Вы должны переопределить acceptsFirstResponder
, чтобы вернуть true:
class DocumentCellView: NSView {
override var acceptsFirstResponder: Bool { return true }
// @IBOutlets and whatnot here...
}
Убедитесь, что вы установили это как настраиваемый класс вашего представления ячейки в раскадровке или xib.
Наконец, свяжите действие вашего пункта меню с doThatThing:
в программе быстрого реагирования:
![элемент меню подключения к первому ответчику](https://i.stack.imgur.com/A3UaP.gif)
Вот как это работает:
Поскольку представление ячеек теперь возвращает true для acceptsFirstResponder
, когда пользователь щелкает представление ячеек в представлении коллекции, система делает его первым ответчиком (начало цепочки ответчиков).
Когда представление имеет контроллер представления, оно делает этот контроллер представления следующим респондентом после себя в цепочке респондентов (если вы используете OS X 10.10 Yosemite или более позднюю версию). В представлении вашей ячейки есть контроллер представления: объект элемента, который вы возвращаете из outlineView:itemForRepresentedObjectAtIndexPath:
. (NSCollectionViewItem
является подклассом NSViewController
, поэтому ваш пользовательский элемент является контроллером представления.)
Когда пользователь щелкает пункт меню, пункт меню просит NSApplication
отправить свое действие по цепочке респондентов, начиная с первого респондента. Первым респондентом является представление ячейки, но оно не отвечает на сообщение doThatThing:
. Итак, NSApplication
запрашивает у представления свой nextResponder
, который является экземпляром вашего подкласса NSCollectionViewItem
. Этот объект действительно отвечает на doThatThing:
, поэтому NSApplication
отправляет doThatThing:
вашему объекту элемента (с объектом NSMenuItem
в качестве аргумента sender
) и не проверяет остальную часть цепочки респондента.
person
rob mayoff
schedule
05.08.2016