无法在Swift 4

时间:2018-01-13 17:05:26

标签: ios swift uibutton swift4

我试图在viewDidLoad()之前加载它之后调用一个按钮函数:

@IBAction func tap(_ sender: UIButton) {
        if(Date().dayNumberOfWeek() == 4) {
            let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertControllerStyle.alert)
        }
    }

override func viewDidLoad() {
        super.viewDidLoad()

        tap(self)

这会返回Cannot convert value of type 'ViewController' to expected argument type 'UIButton'

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

点击方法需要UIButton。但是,在viewDidLoad方法中,您使用self UIViewController调用了tap方法。它们是两个独立的类。

如果您不关心调用对象的类,可以将方法声明更改为

@IBAction func tap(_ sender: Any)

答案 1 :(得分:3)

错误很清楚。您正在将视图控制器传递给期望按钮的方法。

可能您的tap操作已连接到用户界面中的某些UIButton,这就是tap方法期望UIButton参数的原因。

由于您似乎希望从tap手动调用此viewDidLoad方法,因此您应该将引用传递给它所连接的按钮。

假设IBOutletUIButton,请将该出口传递给要点按的来电。

@IBOutlet var myButton: UIButton! // an example of your existing outlet

viewDidLoad中的行更改为:

tap(myButton)

myButton替换为插座的实际名称。

另一个选项是,因为您的tap方法实际上并没有使用sender参数,所以可以去除参数。

@IBAction func tap() {
    // your existing code
}

然后在viewDidLoad中你只需:

tap()

答案 2 :(得分:2)

大多数人都喜欢遵循将IBAction的代码提取到私有函数中的约定。

@IBAction func tap(_ sender: UIButton) {
    presentAlertIfNecessary()
}
private func presentAlertIfNecessary() {
    if(Date().dayNumberOfWeek() == 4) {
        let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertControllerStyle.alert)
         self.present(alert, animated: true)           
    }
}

这样您就可以在viewDidAppear中调用该函数。

override func viewDidAppear() {
    presentAlertIfNecessary()
}

答案 3 :(得分:0)

编辑:

@IBAction func tap(_ sender: UIButton) {
    if(Date().dayNumberOfWeek() == 4) {
        let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertControllerStyle.alert)

         self.present(alert, animated: true)           
    }

}

另外,请记住,您的代码在viewDidload中显示了一个UIAlertController,它可能不会显示为尚未加载视图层次结构,所以最好将代码放在viewDidAppear中,如下所示

override  func viewDidAppear()
{
  tap(UIButton())
}

还必须满足条件日期()。dayNumberOfWeek()== 4 才能看到警报

答案 4 :(得分:0)

该功能期待按钮类型。如果你有一个IBOUtlet按钮,你可以通过它。

class Controller: UIViewController {
    @IBOutlet var button: UIButton!

    @IBAction func tap(_ sender: UIButton) {
        if(Date().dayNumberOfWeek() == 4) {
            let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertControllerStyle.alert)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        tap(button)
    }