Получить щелчки мыши на NSTokenField
Я хотел бы реализовать NSTokenField, который будет отображать токены, которые - при наведении курсора на них - отображают значок удаления. Впоследствии, когда я нажимаю на значок, я хочу, чтобы токен был удален.
После долгих поисков кажется, что это невозможно с помощью стандартного NSTokenField. Если кто-то знает, как, пожалуйста, дайте мне знать.
Я посмотрел на https://github.com/octiplex/OEXTokenField и на основе этого кода я сделал реализацию CustomTokenField в Swift. Пока все хорошо, у меня есть рабочий CustomTokenField, и когда я наводю курсор мыши на токен, он показывает значок удаления.
Следующая фаза оказывается проблемой, которую я не могу понять сам. Как я могу получить щелчок токена, чтобы вызвать обратный вызов?
Класс токена является производным от NSTextAttachmentCell, а CustomTokenField - от NStokenField:
class CustomTokenAttachmentCell: NSTextAttachmentCell {
. . .
}
class CustomTokenField: NSTokenField {
. . .
}
Я попытался подойти к этому, используя два разных угла:
Через CustomTokenAttachmentCell
NSTextAttachmentCell реализует NSTextAttachmentCellProtocol.
public protocol NSTextAttachmentCellProtocol : NSObjectProtocol {
. . .
public func wantsToTrackMouse() -> Bool
public func highlight(flag: Bool, withFrame cellFrame: NSRect, inView controlView: NSView?)
public func trackMouse(theEvent: NSEvent, inRect cellFrame: NSRect, ofView controlView: NSView?, untilMouseUp flag: Bool) -> Bool
. . .
}
Это вселяет надежду. Таким образом, я реализовал эти методы в CustomTokenAttachmentCell и хочет, чтобы на самом деле был вызван wantToTrackMouse(). Я реализовал это, чтобы вернуть "правда".
override func trackMouse(theEvent: NSEvent, inRect cellFrame: NSRect, ofView controlView: NSView?, untilMouseUp flag: Bool) -> Bool {
Swift.print(“trackMouse”)
return true
}
override func highlight(flag: Bool, withFrame cellFrame: NSRect, inView controlView: NSView?) {
Swift.print("highlight")
}
override func wantsToTrackMouse() -> Bool {
Swift.print(“trackMouse”)
return true
}
Два других метода никогда не вызываются. Есть ли что-то еще, что нужно сделать, чтобы их называли?
Через CustomTokenField
Я также пытался подойти к этому из CustomTokenField. Можно получить события мыши, используя MouseDown (), однако я не смог найти способ получить доступ к токенам из ячеек.
Я видел много постов здесь в Stackru, и я видел советы, но ни одна из них, кажется, не указывает в правильном направлении.
Каким-то образом я пришел к выводу, что вы можете получать события мыши только в том случае, если в иерархии есть NSControl. Для токенов это не так. NSControl является частью иерархии представлений, поэтому я пытаюсь добиться этого с помощью CustomTokenField, но я также зашел в тупик. Например, этот вопрос Щелчок токена в NSTokenField точно такой же, но установка действия или цели приведет к фатальной ошибке, потому что setAction и setTarget являются заглушками для базового класса.
Я начинающий программист на Coacoa, так что, надеюсь, это просто вопрос нехватки знаний.
Любой совет будет оценен.
1 ответ
Вы пытались добавить NSButton поверх всего всего CustomTokenAttachmentCell
Посмотреть? Затем добавьте @IBOutlet action
на кнопку для щелчка и передать это через делегирование TokenField
где вы можете контролировать токены, которые отображаются.
Я также пытаюсь реализовать это в своем приложении, поэтому, если вы сможете поделиться каким-либо кодом, это будет с благодарностью. Спасибо!