2016-12-16 60 views
1

xcode的8迅速3 OSX夫特3 OSX button.addTarget

我有內myView.I創建按鈕想動作添加到每個它創建的按鈕的代碼。我相信你通常會使用button.addTarget,但這不適用於OSX任何想法?

感謝

import Cocoa 

class MainWindowController: NSWindowController { 

    var buttonArray: Array<NSButton> = [] 
    var buttonTitleArray: [String] = ["Answer1","Answer2","Answer3","Answer4"] 
    @IBOutlet weak var myView: NSView! 

    override func windowDidLoad() { 
     super.windowDidLoad() 

     var horizontalx = 50 

     //Create button Array and tag buttons 
     for i in 0..<buttonTitleArray.count{ 
      let button = NSButton(frame: NSRect(x: horizontalx, y: 50, width: 100, height: 50)) 
      button.tag = i 
      buttonArray.insert(button, at: i) 
      horizontalx = horizontalx + 100 
     } 

     //Adds Buttons to myView 
     for i in 0..<buttonTitleArray.count{ 
      let button:NSButton = buttonArray[i] 
      button.title = buttonTitleArray[i] 
      myView.addSubview(button) 
     } 

     //Just for testing we can find tag 
     for i in 0..<buttonTitleArray.count{ 
      let buttonFromArray = buttonArray[i] 
      let tag = buttonFromArray.tag 
      if (tag == 2){ 
       print("found Tag") 
      } 
     } 

    }//EO Overide 


}//EnD oF thE wORld 

回答

1

在你的循環中的一個:

button.action = #selector(buttonPressed) 

然後:

func buttonPressed(button:NSButton) { 
    print("Clicked \(button.title)!") 
} 
2

我只是用這個掙扎,主要是用靜態方法,所以我想我'(後期),並補充jlew的答案。

如果你設置了button.action,也要小心你如何設置button.target,特別是如果你離開它nil。請記住,#selector不僅僅是「函數指針」,而是通過對象(目標)的Objective-C方法引用。 Apple的Objective-C Target-Action頁面對此非常有幫助。

假設你想設置一個「關閉」按鈕。這很容易...

...但現在說你希望在結束之前先攔截那個呼叫。你可以這樣做背馱式現有的窗口對象:

 button = NSButton() 
     button.title = "Exit" 
     button.action = #selector(window?.buttonPressed) 
    } 
} 

extension NSWindow { 
    func buttonPressed() { 
     Swift.print("Clicked Exit button!") 
     close() 
    } 
} 

再次,上面當然對於nil一個target。否則,將button.target分配給包含按鈕處理程序的@objc對象。