如何使用嵌套函数执行选择器?

时间:2017-03-24 02:40:52

标签: ios swift selector

我有一个这样的嵌套函数,我想在用户点击我的按钮时调用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()
    }
}

2 个答案:

答案 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规则。