【问题标题】:How to perform selector with a nested function?如何使用嵌套函数执行选择器?
【发布时间】:2017-03-24 02:40:51
【问题描述】:

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

有什么方法可以用#selector 执行childFunc 吗?

编辑 1: 我有使用这样的闭包,但我认为这不是一个好方法,因为我必须创建另一个函数

class MyClass {
    myClosure: () -> () = {}
    func parentFunc() {
        button.addTarget(self, action: #selector(runChildFunc), for: .touchUpInside)
        func childFunc() {
            print("User tapped")
        }
        myClosesure = childFunc

    }
    func runChildFunc() {
        myClosure()
    }
}

【问题讨论】:

    标签: ios swift selector


    【解决方案1】:

    相反,您可以尝试以下代码来实现您的目标

    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

    【讨论】:

    • 欢迎 :) 并感谢 StackOverflow 社区提供了如此出色的平台。
    【解决方案2】:

    有没有办法用#selector 来执行childFunc

    没有。整个想法毫无意义。请记住,嵌套(内部)函数 实际上并不存在。它只是出现,瞬间,当外部函数运行时。外部函数的运行带来内部函数在遇到定义的那一刻就存在,有效地将其存储在局部变量中,以便可以从范围内的后续代码调用它inside 函数。和任何局部变量一样,当外部 func 代码结束时,内部 func 又不存在了。此外,因为它是 func 内部的局部变量,所以它的作用域使得它不能从外部调用,即使这样的概念是有道理的——就像 func 内部的局部变量无法从外部看到一样在函数之外,即使 那个 概念是有道理的。

    选择器必须指向一个类实例的一个方法(类从NSObject派生)。这是一个 Cocoa Objective-C 架构;你必须遵守 Objective-C 规则。

    【讨论】:

    • 您真正想做的也许是给按钮一个闭包,而不是使用目标-动作架构。这是个好主意,你可以在 Stack Overflow 上找到很多关于如何配置这样的东西的讨论(例如这里:stackoverflow.com/questions/25919472/…),但这不是目标-动作架构的工作方式。
    • 那么 Nguyen 应该使用链接中的闭包模式。但是他必须使用不同的语法
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2011-08-07
    • 2013-08-22
    相关资源
    最近更新 更多