Ios 无法转换类型为';ViewController';到预期的参数类型';UIButton';斯威夫特4
我尝试在viewDidLoad()之前加载按钮函数后调用它,如下所示: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
@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
作为总括。这可能是迄今为止最好的答案。