在我的应用程序中,我有几个场景,每个场景都显示不同的UIAlertController
,所以我创建了一个显示此警报的功能,但我似乎无法在"内部调用self.Function。 okAction" 。我收到此错误:
'ViewController'
类型的值没有成员'doAction'
以下是代码:
func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : () )
{
let refreshAlert = UIAlertController(title: titleOfAlert, message: messageOfAlert, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default) {
UIAlertAction in
self.doAction()
}
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default) {
UIAlertAction in
}
refreshAlert.addAction(okAction)
refreshAlert.addAction(cancelAction)
self.presentViewController(refreshAlert, animated: true, completion: nil)
}
这是我打电话的其中一项功能:
func changeLabel1()
{
label.text = "FOR BUTTON 1"
}
我该如何解决?
答案 0 :(得分:13)
删除self
前面的doAction()
,因为您没有在对象上调用该操作。
如果您这样做,编译器会告诉您
Invalid use of '()' to call a value of non-function type '()'
。情况就是这样,因为doAction
不是函数,而是空元组。函数具有输入参数和返回类型。因此doAction
的类型应为() -> Void
- 它不需要输入并返回Void
,即不返回任何内容。
代码应该是这样的:
func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : () -> Void ) {
...
let okAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default) { action in
doAction()
}
...
}
如果您想将action
传递给doAction
方法,则必须将类型更改为(UIAlertAction) -> Void
并通过doAction(action)
进行调用。
答案 1 :(得分:1)
从您的代码 doAction 是函数的第三个参数 showAlertController 。
所以 第一步:将 doAction :()更改为 doAction :() - >() 这意味着doAction是Closure,没有参数和空返回。
第二:呼叫不应该是 self.doAction(),而只是 doAction() 因为它是一个参数而不是实例变量
答案 2 :(得分:0)
我认为指定闭包的正确方法是这样的:
func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : (() -> Void) ){
// and then call it like that
doAction()
}
这里的关键是你不能调用this.doAction()
,因为传递给函数的参数不是控制器上的属性,对吧?