2016-01-13 64 views
2

我創建了一個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等的值?

回答

2

使用你的語法

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