создание простого действия, если NSButton будет нажата в быстрой

Я в процессе обучения быстро. Я хотел бы знать, как программно вызывать функцию при нажатии кнопки. Я пытался это сделать, но функция запускается непосредственно при запуске программы, а не при нажатии кнопки. Можете ли вы помочь мне исправить это.

Вот что я пробовал,

//
//  ViewController.swift
//  hjkhjkjh
//
//  Created by iznogoud on 14/05/16.
//  Copyright © 2016 iznogoud. All rights reserved.
//

import Cocoa


class ViewController: NSViewController {

    func printSomething() {
       print("Hello")
    }

    override func viewDidLoad() {
       super.viewDidLoad()

       let myButtonRect = CGRect(x: 10, y: 10, width: 100, height: 10)
       let myButton =  NSButton(frame: myButtonRect)
       view.addSubview(myButton)
       myButton.target = self
       myButton.action = Selector(printSomething())


       // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
       didSet {
          // Update the view, if already loaded.
       }
    }
}

Ответы

Ответ 1

Проблема заключается в том, как вы добавляете свой selector

myButton.action = Selector(printSomething())

Синтаксис для добавления селекторов немного странный, вы даете ему строку с именем функции, поэтому в вашем случае вы должны написать:

myButton.action = Selector("printSomething")

Что должно наградить вас Hello в вашей консоли.

И, вероятно, из-за того, что синтаксис вызывает у людей проблемы, он был изменен в Swift 2.2, поэтому теперь вы пишете:

myButton.action = #selector(ViewController.printSomething)

вместо этого. Это означает, что компилятор может помочь вам обнаружить эти ошибки на раннем этапе, что, я думаю, является большим шагом вперед. Подробнее об этом вы можете прочитать в заметках о выпуске Swift 2.2 здесь

Итак... вот весь ваш пример:

import Cocoa

class ViewController: NSViewController {

    @objc
    func printSomething() {
        print("Hello")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let myButtonRect = CGRect(x: 10, y: 10, width: 100, height: 10)
        let myButton =  NSButton(frame: myButtonRect)
        view.addSubview(myButton)

        myButton.target = self
        myButton.action = #selector(ViewController.printSomething)
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

Надеюсь, это поможет вам.