ChatGPT解决这个技术问题 Extra ChatGPT

UIButton 删除所有目标动作

我已将多个 target-action-forControlEvents: 添加到 UIButton。我想一次性删除所有这些而不释放任何东西。然后我会设定新的目标。

这可能吗?我该怎么做?


V
Ved Sharma

调用 removeTarget:action:forControlEvents:,为目标传递 nil,为操作传递 NULL,并使用设置所有位的控制掩码 (UIControlEventAllEvents)。

Objective-C

[someControl removeTarget:nil 
                   action:NULL 
         forControlEvents:UIControlEventAllEvents];

斯威夫特 2

button.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

Swift 3 或更高版本

button.removeTarget(nil, action: nil, for: .allEvents)

谢谢你的提示!这是我认为的完整链接(即该部分):“developer.apple.com/iphone/library/documentation/uikit/…:”
progrmr 的建议当然有效。要在此处添加答案,是我需要的代码片段: [button removeTarget:nil action:NULL forControlEvents:UIControlEventTouchUpInside];
另外:-allTargets 实例方法返回所有实例目标的 NSSet(如果没有,则返回 nil)。
完美的!正是我想要的:D
使用 Swift 2 和 3 进行了更新,因为存在完全相同的答案的竞争答案,只是语言不同。
H
Hlung

@progrmr 在 Swift 2 中的回答:

button.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

和斯威夫特 3:

button.removeTarget(nil, action: nil, for: .allEvents)

注意:Swift 没有 NULL,所以我测试了用 nil 替换它,它似乎工作正常。


对于 Swift 3:“.AllEvents”现在是“.allEvents”(带有小写的“a”):removeTarget(nil, action: nil, for: .allEvents)
关于您的注意事项:实际上,我相信您也可以将 nilNULL 传递给 Objective-C 中的第一个和第二个参数,它会起作用。我相信两者都被定义为 (void*) 0 (或至少,评估为相等)。
@Sasho 我希望看到一些关于升级到 Swift 3 时源文件大小(平均)下降多少的统计数据 :-)(由于新的方法/参数命名规则)。
由于这是不同语言的相同答案,并且该语言未在此问题中标记,因此应该是对@progrmr 答案的编辑。
M
Mohit Kumar

斯威夫特 3、4、5:

btnCancel.removeTarget(nil, action: nil, forControlEvents: UIControlEvents.AllEvents)

请指出您所涵盖的语言
@JuanPabloBoero,它很快
T
Tim Langner

斯威夫特 2:

actionButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

斯威夫特 3 和 4:

actionButton.removeTarget(nil, action: nil, for: .allEvents)

目标-C:

[actionButton removeTarget: nil action: NULL forControlEvents: UIControlEventAllEvents];

U
UdayM
- removeTarget:action:forControlEvents:

此方法停止向指定目标对象传递事件。

在目标参数中指定一个有效对象,此方法停止将指定事件传递给与该对象关联的所有操作方法。为目标参数指定nil,该方法防止将那些事件传递给所有目标对象的所有动作方法objective-c: [_myButton removeTarget: //any validObject (or) nil action:nil forControlEvents:UIControlEventAllEvents]; swift: myButton.removeTarget(*validObject or nil*, action:nil, forControlEvents:UIControlEvents.AllEvents)

更多详情https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/index.html#//apple_ref/occ/instm/UIControl/removeTarget:action:forControlEvents


D
Divesh singh

如果有条件,您可以更改选择器。见下面的例子

您可以先删除所有目标,然后选择选择器并添加它。

rateButton.removeTarget(nil, action: nil, for: .allEvents)

    let action = interview.isRated ? #selector(viewTapped(_:)) : #selector(rateTapped(_:))
            
    rateButton.addTarget(self, action: action, for: .touchUpInside)