目标动作被调用两次。

6
我有一个VC RaceDayChecklistViewController.m,它是RaceDayChecklistViewControllerBase.m的子类。
在RaceDayChecklistVC.m中,添加了一个目标动作,该动作被调用两次。nextOrNewButton是我想要调用“demo”操作的按钮。 此外,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 - Lalit_vicky
4个回答

6

UIButton 按下时会生成多个事件:通常是 UIControlEventTouchDownInsideUIControlEventTouchUpInside。因此,如果您想处理按下事件,应该捕获您需要的那个事件(可能是 UIControlEventTouchUpInside),而不是 UIControlEventsAll


2

我能看到这个

[nextOrNewButton removeTarget:self action: @selector(demo) forControlEvents:UIControlEventAllEvents];

这意味着,当您触摸按钮时,会触发touch up事件(UIControlEventTouchUpInside),因此它将触发一次。之后,将会触发touch down,并再次使用UIControlEventTouchDownInside触发。因此,您可以使用以下内容:
[nextOrNewButton removeTarget:self action: @selector(demo) forControlEvents:UIControlEventTouchUpInside];

1
您正在听取所有事件,因此您正在获取所有事件。
通常,要捕获按钮点击事件,我们会使用UIControlEventTouchUpInside。 这里是适合您的选项。
        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
1
@Lalit_vicky 你可能想要使用 UIControlEventTouchUpInside - Mick MacCallum
@Lalit_vicky 你可以使用https://dev59.com/KWUq5IYBdhLWcg3wBL7j。 - Vijay-Apple-Dev.blogspot.com

0

由于您设置了UIControlEventAllEvents,因此当您触摸按钮时,它会接受两种类型的触摸,所以您应该只使用一种类型的Event,即UIControlEventTouchUpInsideUIControlEventTouchUpOutside

[nextOrNewButton addTarget:self action:@selector(demo) forControlEvents: UIControlEventTouchUpInside];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接