Получить щелчки мыши на 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 где вы можете контролировать токены, которые отображаются.

Я также пытаюсь реализовать это в своем приложении, поэтому, если вы сможете поделиться каким-либо кодом, это будет с благодарностью. Спасибо!

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