我有一个这样的嵌套函数,我想在用户点击我的按钮时调用childFunc
,但它不起作用
class MyClass {
func parentFunc() {
button.addTarget(self, action: #selector(parentFunc().childFunc), for: .touchUpInside)
func childFunc() {
print("User tapped")
}
}
}
它会引发这样的错误:
Value of tuple type '()' has no member 'childFunc'
有没有办法用childFunc
执行#selector
?
编辑1: 我使用这样的闭包,但我认为这不是一个好方法,因为我必须做另一个功能
class MyClass {
myClosure: () -> () = {}
func parentFunc() {
button.addTarget(self, action: #selector(runChildFunc), for: .touchUpInside)
func childFunc() {
print("User tapped")
}
myClosesure = childFunc
}
func runChildFunc() {
myClosure()
}
}
答案 0 :(得分:4)
相反,您可以尝试使用以下代码来实现目标
class MyClass {
let button = UIButton()
@objc public func parentFunc(_ sender : UIButton?)
{
func childFunc() {
print("User tapped")
}
if sender != nil && sender.tag == 100{
childFunc()
return
}
button.addTarget(self, action: #selector(parentFunc(_:)), for: .touchUpInside)
button.tag = 100
}
}
在上面的代码中,Sender是可选的,所以当你不想调用像parentFunc(nil)
这样的子函数时你可以传递nil
答案 1 :(得分:3)
有没有办法用#selector
执行childFunc
没有。整个想法毫无意义。请记住,嵌套(内部)函数并不存在。当外部函数运行时,只有 暂时存在。外部函数的运行在遇到定义时将内部函数存在,有效地将其存储在局部变量中,以便可以从范围 inside <中的后续代码中调用它。 / em> func。和任何局部变量一样,当外部函数代码结束时,内部函数将不再存在。此外,因为它是func中的局部变量,所以它的范围是不能从外部调用的,即使这样的概念是有意义的 - 就像func中的局部变量不能从func外部看,即使 概念有意义。
选择器必须指向类实例的方法(类派生自NSObject)。这是一个Cocoa Objective-C架构;你必须遵守Objective-C规则。