目标动作被调用两次
Posted
技术标签:
【中文标题】目标动作被调用两次【英文标题】:Target action is called twice 【发布时间】:2014-01-31 12:24:37 【问题描述】:我有一个 VC RaceDayChecklistViewController.m,它是 RaceDayChecklistViewControllerBase.m 的子类。
在 RaceDayChecklistVC.m 中,添加了一个被调用两次的目标操作。 nextOrNewButton 是单击我要调用“演示”操作的按钮。 另外,checklistnavigationItem 是条形按钮项。
- (void)viewDidLoad
checklistTableViewBase=checklistTableView;
checklistNavigationItemBase=checklistnavigationItem;
nextOrNewButtonBase=nextOrNewButton;
[nextOrNewButton addTarget:self action:@selector(demo) forControlEvents:UIControlEventAllEvents];
-(void) demo
RaceDayDataController *sharedController = [RaceDayDataController sharedDataController];
if (sharedController.isSubmited)
[self.checklistnavigationItem setTitle:@"New"]; //
else
[self.checklistnavigationItem setTitle:@"Next"];
[self showAlert];
-(void) viewWillDisappear:(BOOL)animated
[nextOrNewButton removeTarget:self action: @selector(demo) forControlEvents:UIControlEventAllEvents];
多次调用动作演示的原因可能是什么?它是如何负责的基类吗?
请指导。
【问题讨论】:
不,它是我唯一使用的地方.. @mani 【参考方案1】:UIButton
按下时会产生多个事件:通常是UIControlEventTouchDownInside
和UIControlEventTouchUpInside
。所以,如果你想处理新闻,你应该抓住你需要的(可能是UIControlEventTouchUpInside
),而不是UIControlEventsAll
。
【讨论】:
【参考方案2】:我可以看到这个
[nextOrNewButton removeTarget:self action: @selector(demo) forControlEvents:UIControlEventAllEvents];
也就是说,当你触摸按钮时,touch up
event(UIControlEventTouchUpInside
) 触发,所以它会触发一次。之后,touch down
会发生,所以它会用UIControlEventTouchDownInside
再次触发。
所以你可以使用它,
[nextOrNewButton removeTarget:self action: @selector(demo) forControlEvents:UIControlEventTouchUpInside];
【讨论】:
【参考方案3】:当您设置UIControlEventAllEvents
时,这就是为什么当您触摸按钮时需要两种类型的触摸,因此您应该只使用Event
的一种类型,UIControlEventTouchUpInside
或UIControlEventTouchUpOutside
。
[nextOrNewButton addTarget:self action:@selector(demo) forControlEvents: UIControlEventTouchUpInside];
【讨论】:
【参考方案4】:您正在监听所有事件,因此您正在获取所有事件。
通常要捕获按钮点击事件,我们需要 UIControlEventTouchUpInside。
Here is the option for you.
typedef NS_OPTIONS(NSUInteger, UIControlEvents)
UIControlEventTouchDown = 1 << 0, // on all touch downs
UIControlEventTouchDownRepeat = 1 << 1, // on multiple touchdowns (tap count > 1)
UIControlEventTouchDragInside = 1 << 2,
UIControlEventTouchDragOutside = 1 << 3,
UIControlEventTouchDragEnter = 1 << 4,
UIControlEventTouchDragExit = 1 << 5,
UIControlEventTouchUpInside = 1 << 6,
UIControlEventTouchUpOutside = 1 << 7,
UIControlEventTouchCancel = 1 << 8,
UIControlEventValueChanged = 1 << 12, // sliders, etc.
UIControlEventEditingDidBegin = 1 << 16, // UITextField
UIControlEventEditingChanged = 1 << 17,
UIControlEventEditingDidEnd = 1 << 18,
UIControlEventEditingDidEndOnExit = 1 << 19, // 'return key' ending editing
UIControlEventAllTouchEvents = 0x00000FFF, // for touch events
UIControlEventAllEditingEvents = 0x000F0000, // for UITextField
UIControlEventApplicationReserved = 0x0F000000, // range available for application use
UIControlEventSystemReserved = 0xF0000000, // range reserved for internal framework use
UIControlEventAllEvents = 0xFFFFFFFF
;
【讨论】:
什么最合适..这是我第一次使用目标..你能指导一下..我只需点击按钮并移动.. @Lalit_vicky 你可能想使用UIControlEventTouchUpInside
。
@Lalit_vicky 可以使用***.com/questions/14856906/…以上是关于目标动作被调用两次的主要内容,如果未能解决你的问题,请参考以下文章
redux-saga 与 redux 一起使用会导致 render() 被调用两次
避免在 scipy.optimize.minimize 中调用函数两次