如何在 iOS 中找到目标的动作函数

How do I find the action function for a target in iOS

希望我能说清楚。我有按钮,我想知道它的 .touchDown 事件的目标是什么对象中的什么函数。 iOS 中的属性和函数可能正是我要找的,但我无法使它们工作。 属性 是: self.allTargets 功能是: self.actions(forTarget:, forControlEvent:)

我用这段代码打印了值:

print( self.allTargets )
print( self.actions(forTarget: self, forControlEvent: .touchDown) ?? "no targets")
print( self.actions(forTarget: Button_Test.ViewController , forControlEvent: .touchDown) ?? "no targets")
print( self.actions(forTarget: "ViewController", forControlEvent: .touchDown) ?? "no targets")

结果:

[AnyHashable(<Button_Test.ViewController: 0x7b293300>)]
no targets
no targets
no targets

我可以看到按钮有目标,但我无法获取功能。求助!

我想我有点理解你,我想你可能对按钮目标的事情有些困惑,所以我将解释以下内容,希望它能帮助你找到你想要的东西。

let button = UIButton()
button.addTarget(target: self, action: #selector(randomFunction) for: .touchInsideUp). 

按钮添加的目标是它希望从中获取函数 "randomFunction" 的目标。

因此,如果您正在编写代码,比方说,MyViewController,然后将目标指定为 self,我们对 Button 说:"get the selector function from MyViewController"。

.touchInsideUp 是将触发Button 执行选择器中功能的事件,在本例中为"randomFunction"。但是为了让您知道在哪里可以找到该功能,这就是您需要设置 "target" 的原因。

现在,由于编译器知道它应该在什么时候执行一个函数(例如.touchInsideUp),并且它也知道它应该查看哪个控制器(MyViewController),所以它会在任何时候执行 MyViewController 中的 randomFunction()您对按钮执行 .touchInsideUp 操作。

希望对您有所帮助。

似乎目标 AnyHashable(<Button_Test.ViewController: 0x7b293300>) 被注册为执行一个或多个控制事件的动作,但假设 self == Button_Test.ViewController 在内存地址 [=15] =], 只是没有注册特定的控制事件 .touchDown

UIButton 最常见的触发动作的控制事件是 .touchUpInside。您是否尝试过指定该事件,例如:

print( self.actions(forTarget: self, forControlEvent: .touchUpInside))

另一种可能是self不是注册的目标。如果您添加此行,控制台会说什么:

print(self)

self的类型是Button_Test.ViewController,地址是0x7b293300

请注意,您的第三个和第四个 print() 语句永远不会 return 有效结果,因为它们传递的目标与按钮上存在的实际目标不匹配(在一种情况只是 type Button_Test.ViewController,另一种情况是字符串 "ViewController")。

要获取给定控制事件的所有 target/action 对(在本例中为 .touchDown),您需要执行以下操作:

let targets = self.allTargets
for target in targets {
    if let actions = self.actions(forTarget: target, forControlEvent: .touchDown) {
        for action in actions {
            print("taget: \(target) - \(action)")
        }
    }
}

基本上您需要遍历所有目标并获取给定事件的每个目标的操作列表。