目标动作被调用两次

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 按下时会产生多个事件:通常是UIControlEventTouchDownInsideUIControlEventTouchUpInside。所以,如果你想处理新闻,你应该抓住你需要的(可能是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 的一种类型,UIControlEventTouchUpInsideUIControlEventTouchUpOutside

[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/…

以上是关于目标动作被调用两次的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIControl,动作调用两次

redux-saga 与 redux 一起使用会导致 render() 被调用两次

避免在 scipy.optimize.minimize 中调用函数两次

如果两个依赖路径改变为可观察的,则Knockout在单个动作上计算多次触发

如何调用两次在ngrx效果中调用的服务?

为啥 ngOnInit 被调用两次?