Swift 4中的addTarget有什么问题

时间:2019-01-07 21:38:02

标签: swift

错误说:

  

在声明之前使用局部变量'SwtchChange(Parametr:)'

请,我需要更改什么?

mySwitch.addTarget(self, action: #selector(SwtchChange(Parametr:)), for: .valueChanged)

func SwtchChange(Parametr: UISwitch) {
    if mySwitch.isOn {
        print ("Yeah")
    } else {
        print ("Nope")
    }

3 个答案:

答案 0 :(得分:1)

您的问题是在试图添加目标的相同范围内声明函数。

如果您以某种方式设法在viewDidLoad或其他地方声明了函数,则首先需要将函数移至类级别,然后将@objc添加到函数的开头。

假设您添加目标并在同一范围内声明func,请按如下所示修改代码并将方法声明移至外部范围:

override func viewDidLoad() {
    super.viewDidLoad()
    mySwitch.addTarget(self, action: #selector(swtchChange), for: .valueChanged)
}

@objc func swtchChange(parametr: UISwitch) {
    if parametr.isOn {
        print ("Yeah")
    } else {
        print ("Nope")
    }
}

另外,最好按照注释中的说明将函数名称以小写开头,因此我从swtchChange将函数名称编辑为SwtchChange。此外,参数名称也已更新并在方法范围内使用。

答案 1 :(得分:0)

  

在声明之前使用局部变量'SwtchChange(Parametr:)'

您收到此错误,是因为您在调用该方法后将方法嵌入到另一个方法中(可能是viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    mySwitch.addTarget(mySwitch, action: #selector(SwtchChange(Parametr:)), for: .valueChanged)

    func SwtchChange(Parametr: UISwitch) {
        if mySwitch.isOn {
            print ("Yeah")
        } else {
            print ("Nope")
        }
    }
}

请勿执行此操作,您的目标方法应在视图控制器的全局范围中声明,并且由于您使用的是Selector,因此必须将您的方法标记为{ {1}}

@objc

...还请注意,变量/方法的名称应以大写字母开头,类型的名称应以大字母开头大写字母

答案 2 :(得分:0)

在Swift中使用选择器时,您需要确保功能标记为@objc。试试这个:

    mySwitch.addTarget(self, action: #selector(switchChanged(_:)), for: .valueChanged)

    @objc func switchChanged(_ sender: UISwitch) {
        if sender.isOn {
           print ("Yeah")
        } else {
           print ("Nope")
        }
    }