Читать словарь из NSEvent userData

Я создал NSTrackingArea и я передаю словарь в userInfo аргумент.

let trackingData = ["section": 1, "sectionRow": 12, "done": false]
let trackingArea = NSTrackingArea(
                            rect: cellView.bounds,
                            options: [NSTrackingAreaOptions.MouseEnteredAndExited, NSTrackingAreaOptions.ActiveAlways],
                            owner: self,
                            userInfo: trackingData as? [String : AnyObject])
cellView.addTrackingArea(trackingArea)

Это событие успешно получено здесь;

override func mouseEntered(event: NSEvent) {
        print("Mouse Entered \(event.userData)")
    }

Как я могу прочитать значения для раздела и т.д. из userData?

2 ответа

Решение

Используя ваш синтаксис

if let userData = event.trackingArea?.userInfo as? [String : AnyObject] {
  let section = userData["section"] as! Int
}

Но если вы передадите done ключ как Int со значением 0 или же 1 скорее, чем Boolвам не нужно приводить значения словаря, потому что он отличается [String:Int]

let trackingArea = NSTrackingArea(rect: ... , userInfo: trackingData)

а также

if let userData = event.trackingArea?.userInfo as? [String : Int] {
  let section = event.userData["section"]!
}  

Дополнительные привязки предназначены для обеспечения безопасности, если есть еще события для получения и отслеживания.

В документации говорится:

При обработке такого события вы можете получить словарь, отправивuserDataкNSEventобъект.

Но, похоже, это неправильно. Мне так и не удалось каким-то образом отобразить или отобразитьNSEvent.userData(который имеет типUnsafeMutableRawPointer?) вернуться к[String: Any]. Вместо этого вы можете сделать это:

      override func mouseEntered(with event: NSEvent) {
    let userInfo = event.trackingArea!.userInfo!
}
Другие вопросы по тегам