2015-11-17 76 views
0

我創建了默認的Cocoa/Swift應用程序。下面是我的AppDelegate類。我已將窗口中的視圖掛鉤到AppDelegate中的view IBOutlet。將swift數組的元素賦值給userdata參數觸發器didSet

我想要做的是從數組中分配一個元素給用戶數據作爲工具提示。代碼執行並打印三次「did set」。我原以爲它只會打印兩次「did set」,但第三次是調用addToolTipRect時,我傳入數組的第一個元素作爲工具提示rect的用戶數據。

這對我來說似乎很陌生,我想知道如果有人知道我可以如何避免這種行爲。我一直在尋找的行爲是,只有當myArray被分配給可能完全不同的數組時,纔會調用didSet。也許didSet不是我想要使用的......如果不是,它應該是什麼?

有一個簡單的測試項目,在展示這種行爲:

https://github.com/ericgorr/tooltip_arrays

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate 
{ 
    @IBOutlet weak var window: NSWindow! 
    @IBOutlet weak var view: NSView! 

    var myArray   = [[String:AnyObject]]() 
    { 
     didSet 
     { 
      NSLog("did set") 
     } 
    } 

    override func view(view: NSView, stringForToolTip tag: NSToolTipTag, point: NSPoint, userData data: UnsafeMutablePointer<Void>) -> String 
    { 
     let pUserData = UnsafeMutablePointer<[String:AnyObject]>(data) 
     let userData = pUserData.memory 

     return "hello" 
    } 

    func applicationDidFinishLaunching(aNotification: NSNotification) 
    { 
     self.myArray.append([ "one" : "a" ]) 
     self.myArray.append([ "two" : "b" ]) 

     view.addToolTipRect(NSMakeRect(0, 0, 100, 100), owner: self, userData: &(myArray[0])) 
    } 



    func applicationWillTerminate(aNotification: NSNotification) 
    { 
    } 
} 

回答

1

.addToolTipRectuserData參數是INOUT參數,這意味着它訪問的讀寫元素:連如果值未更改,則在此情況下會按預期觸發didSet。

參考:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID545

當函數被調用時,參數的值被複制。 在函數的主體中,副本被修改。 函數返回時,副本的值被分配給原始參數。

在這種情況下,使用&即使數組中的值沒有改變,數組也會被方法寫入。

+0

是的,這一切都有道理。所以,問題是我能做些什麼呢?我需要的工具提示數量與數組中的元素數量相同,並且數組中元素的數量可以在應用程序的生命週期中改變。因此,將工具提示所需的信息存儲在數組中並將指向數組元素的指針作爲工具提示的用戶數據傳遞是很自然的。如果我目前的實施不起作用,那麼這種行爲的推薦實施是什麼?創建一個包含工具提示信息並且沒有didSet的不同數組? – ericg

+0

我不是一個關於addToolTipRect的專家,但據我所知,你做對了。我最近閱讀過文檔,這也是我所做的。 //如果它不起作用(或者行爲不符合您的期望),我們將在那裏解決它。 ;) – Moritz

+0

好的。我仍然需要一個解決方案。我想現在唯一的一個是用工具提示信息創建一個單獨的數組。實際情況下,主數組上的didSet需要做一些實際的工作,並通過調用addToolTipRect來嚴格控制事件,從而觸發分配數組元素。如果你想給你的答案添加一個建議的解決方案,我會將其標記爲答案。 – ericg