1

我希望我能说清楚。我有按钮,我想知道什么对象中的什么函数是它的 .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

我可以看到按钮有一个目标,但我无法获得该功能。帮助!

4

3 回答 3

1

要获取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)")
        }
    }
}

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

于 2016-12-04T18:41:06.667 回答
0

似乎目标AnyHashable(<Button_Test.ViewController: 0x7b293300>)已注册为执行一个或多个控制事件的操作,但假设self== Button_Test.ViewControllerat memory address 0x7b293300,它只是没有为特定的控制事件注册.touchDown

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

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

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

print(self)

是类型self Button_Test.ViewController还是地址0x7b293300

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

于 2016-12-04T18:27:51.863 回答
0

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

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

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

因此,如果您正在编写代码,比如说 MyViewController,然后将目标指定为 self,我们对 Button 说:“从 MyViewController 获取选择器函数”。

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

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

希望它有所帮助。

于 2016-12-04T18:21:05.617 回答