Ios 无法转换类型为';ViewController';到预期的参数类型';UIButton';斯威夫特4

Ios 无法转换类型为';ViewController';到预期的参数类型';UIButton';斯威夫特4,ios,swift,uibutton,swift4,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: UIAlertControllerSty

我尝试在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)
这将返回
无法将“ViewController”类型的值转换为预期的参数类型“UIButton”

如何修复此问题?

编辑:

@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,它可能不会在尚未加载视图层次结构时显示,因此最好将代码放在viewDidload中,如下所示

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

此外,必须满足条件Date().dayNumberOfWeek()==4,才能看到警报

点击方法需要一个
ui按钮
。但是,在
viewDidLoad
方法中,您正在使用
self
调用tap方法,这是一个
UIViewController
。他们是两个独立的班级

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

@IBAction func tap(_ sender: Any)

错误很明显。您正在将视图控制器传递给需要按钮的方法

您的
tap
操作可能连接到用户界面中的某个
UIButton
,这就是
tap
方法需要
UIButton
参数的原因

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

假设您有一个用于
ui按钮的
IBOutlet
,然后将该outlet传递给要点击的呼叫

@IBOutlet var myButton: UIButton! // an example of your existing outlet
viewDidLoad
中的行更改为:

tap(myButton)
myButton
替换为门店的实际名称

另一个选项是,由于您的
tap
方法实际上没有使用
sender
参数,因此您可以去掉该参数

@IBAction func tap() {
    // your existing code
}
然后在
viewDidLoad
中,您只需执行以下操作:

tap()

函数应为按钮类型。如果你有一个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)
    }

大多数人喜欢按照惯例将iAction的代码提取到私有函数中

@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)           
    }
}
这样,您可以在ViewDidDisplay中调用函数

override func viewDidAppear() {
    presentAlertIfNecessary()
}

我将尝试您编辑过的版本,但您发布的解决方案只返回“以NSException类型的未捕获异常终止”执行此操作@iAction func tap(uuSender:UIViewController),并将tap(self)保留为“我如何执行此操作?”不要更改
tap
方法的签名。大概是系在一个按钮上。更改签名会在点击按钮时导致崩溃。@rmaddy您的意思是什么?请评论点击功能并运行,我认为问题是由应用程序的另一部分引起的。您的按钮确实有插座吗?不要简单地添加我在回答中显示的示例,因为这将导致崩溃。这只是一个例子。它假设您已经拥有自己的出口,您需要将实际出口传递到
viewdiload
中的
tap
方法。这正是我的回答。在太多人投票之前,这不是一个好的解决方案。您不应为发件人指定任何
。有一些适当的解决方案不需要使用
Any
作为总括。这可能是迄今为止最好的答案。