从NSEvent中读取字典userData

问题描述:

我创建了一个NSTrackingArea,我在userInfo参数中传递字典。从NSEvent中读取字典userData

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中读取section等的值?

使用你的语法

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

但是,如果你通过doneInt与价值01而非Bool,你不需要投的字典的值,因为它是不同的[String:Int]

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

and

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

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

+0

这正是我试图去做的。但它给了我这个错误:无法将类型'String'的值转换为期望的参数类型'Int' –

+0

'NSTrackingArea'将'userInfo'字典传递为'[NSObject:AnyObject]?',因此您必须将字典转换为更具体的东西。而且你还必须明确地阅读跟踪区域​​。我更新了答案。 – vadian

+1

我刚刚注意到了,谢谢@LeoDabus – vadian