2016-12-16 16 views
1

Xcodeの8 SWIFT 3。私はあなたが通常button.addTargetを使用すると思うが、これはOSXのためにはうまくいかない?あなたのループの1つでスウィフト3 OSX button.addTarget

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を設定した場合は、特にnilのままにしておくと、button.targetの設定には注意が必要です。 #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() 
    } 
} 

を繰り返しますが、もちろん上記をniltargetため。それ以外の場合は、ボタンハンドラを含む@objcオブジェクトにbutton.targetを割り当てます。