【问题标题】: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

标签: ios iphone objective-c


【解决方案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 可以使用stackoverflow.com/questions/14856906/…
        猜你喜欢
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多