例如,假设我设置了一个具有事件选择器的按钮:
[button addTarget:self action:@selector(handler1:) forControlEvents:UIControlEventTouchUpInside];
后续代码中,根据特定应用程序情况,我希望为相同的控件事件向同一个按钮添加另一个事件处理程序:
[button addTarget:self action:@selector(handler2:) forControlEvents:UIControlEventTouchUpInside];
这个方法可以正常工作,两个事件都确实被调用了。但我的问题是,在不删除按钮上的handler1的情况下,我如何使handler2被调用时,该事件被"消耗",从而不调用handler1?
我之所以有这样的情况,是因为我想让我的应用进入教程模式,在该模式下动态绑定新的事件到按钮上。教程将指导用户点击某个按钮,但我希望屏幕上其他按钮的点击事件被忽略,基本上强制用户点击请求的按钮以继续进行教程。因此,当用户进入教程时,每个按钮都会添加一个新的TouchUpInside handler。我希望首先调用这个新的handler并阻止原始handler执行。
我已经能够通过获取所有原始事件并对所有现有事件调用[button removeTarget...]
来使其首先被调用。然后我添加了我的动态事件,然后重新添加了集合中的所有原始事件。在调试器中,这可以显示我的动态事件确实被首先调用。
- 例如:
- handler1在按下时会执行某些操作(按钮的默认处理程序)
- handler2是动态添加的,将与教程控制器通信,"消耗"触摸事件(防止handler1执行)。
当不处于教程模式时,我仍希望handler1执行其预期的操作,但如果存在handler2,则希望该方法运行,然后防止调用handler1。我不能从按钮中删除handler1,因为当教程结束时,我希望应用程序按预期工作。此外,我可能有某些情况仍希望调用handler1。
所以,有没有可能消耗一个事件并阻止其他相关事件的触发?
我已经尝试在handler2中使用[button resignFirstResponder]
,但似乎没有起作用。它仍然调用原始按钮事件处理程序。