从 NSEvent userData 读取字典

问题描述 投票:0回答:2

我创建了一个

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 读取部分等的值?

swift cocoa nsevent nstrackingarea
2个回答
4
投票

使用你的语法

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"]!
}  

如果有更多事件需要接收和跟踪,可选绑定是为了安全起见。


0
投票

文档内容如下:

处理此类事件时,您可以通过将

userData
发送到
NSEvent
对象来获取字典。

但这似乎是错误的。相反,你可以这样做:

override func mouseEntered(with event: NSEvent) {
    let userInfo = event.trackingArea!.userInfo!
}
© www.soinside.com 2019 - 2024. All rights reserved.