【问题标题】:UIButton remove all target-actionsUIButton 删除所有目标动作
【发布时间】:2011-03-21 10:16:55
【问题描述】:

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

这可能吗?我该怎么做?

【问题讨论】:

    标签: ios uibutton


    【解决方案1】:

    调用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 的建议当然有效。在这里添加一个代码 sn-p 就像我需要的那样:[button removeTarget:nil action:NULL forControlEvents:UIControlEventTouchUpInside];
    • 旁白:-allTargets 实例方法返回所有实例目标的 NSSet(如果没有,则为零)。
    • 完美!正是我想要的:D
    • 使用 Swift 2 和 3 进行了更新,因为存在具有完全相同答案的竞争答案,只是语言不同。
    【解决方案2】:

    @progrmr 在 Swift 2 中的回答:

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

    和 Swift 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的答案进行编辑。
    【解决方案3】:

    斯威夫特 3、4、5:

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

    【讨论】:

    • 请指出您所涵盖的语言
    • @JuanPabloBoero,很快
    【解决方案4】:

    斯威夫特 2:

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

    Swift 3 和 4:

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

    目标-C:

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

    【讨论】:

      【解决方案5】:
      - removeTarget:action:forControlEvents:
      

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

      1. 在目标参数中指定一个有效对象,此方法会停止将指定事件传递给与该对象关联的所有操作方法。

      2. 为目标参数指定nil,此方法可防止将这些事件传递给所有目标对象的所有操作方法

        目标-c:

        [_myButton removeTarget:  //any validObject (or) nil
                      action:nil
            forControlEvents:UIControlEventAllEvents]; 
        

        斯威夫特:

        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:

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-03
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多