这只是一个简单的问题,大部分是我注意到并且相当困惑的事情。我过去曾使用过addTarget,并注意到如果你动态调用addTarget,并设置相同的目标/动作两次,比如按钮 - 使用addTarget方法。尽管我们已经“添加”了一个目标和动作,但不管它们是同一个目标和动作,动作本身只被调用一次。
所以,我的问题 - 如果它的目标/操作堆栈中已经存在另一个目标,addTarget是否会忽略添加另一个目标?
答案 0 :(得分:18)
UIButton
是一个UIControl
对象,它遵循一个事件监听器模式,该模式通常使用目标(也称为Listener或Observers)的hashmap(Objective-C中的NSDictionary)实现。由于目标是作为键添加的,因此保证不会添加多次。
addTarget:action:forControlEvents:
UIControl
的文档将此行为描述为安全功能:
使用相同的target和action参数值多次调用此方法也是安全的。该控件维护其附加目标的列表以及每个支持的事件的动作。
要禁用给定控件事件的响应,讨论会指出您必须删除目标操作注册,这类似于从散列映射中删除密钥:
为controlEvents参数指定值0不会阻止将事件发送到先前注册的目标和操作方法。要停止传递事件,请始终调用removeTarget:action:forControlEvents:method。