UIButton 多个事件

Posted

技术标签:

【中文标题】UIButton 多个事件【英文标题】:UIButton multiple events 【发布时间】:2016-06-01 08:25:05 【问题描述】:

我正在处理一个要求执行以下步骤的项目。

    显示初始计数为 0 的 UIButton 第一次触摸 UIButton 会增加计数 第二次触摸UIButton,计数每1秒递增一次

我的代码卡在第 3 步,如果我第二次触摸 UIButton,计数将继续递增 1。我永远无法进入 [self performSelector:@selector(doDelay:) withObject:button afterDelay:1.0]

如何添加一个计数器来计算用户点击了多少次UIButton

这是我的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    CGRect rect=[[UIScreen mainScreen] bounds];
    UIButton *button=[[UIButton alloc] initWithFrame:rect];
    button.backgroundColor=[UIColor redColor];
//Step (1)
    [button setTitle:@"Count = 0" forState:UIControlStateNormal];
    [self.window addSubview:button];
//Step (2)    
    [button addTarget:self action:@selector(doButton:) forControlEvents:UIControlEventTouchUpInside];
//Step (3)
    [self performSelector:@selector(doDelay:) withObject:button afterDelay:1.0];

    return YES;    

-(void)doButton:(id)sender

    static int count;
    count++;
    NSString *s = [NSString stringWithFormat:@"Count = %i", count];
    UIButton *b = sender;
    [b setTitle:s forState:UIControlStateNormal];

-(void)doDelay:(id)object

    [self doButton:object];
    [self performSelector:@selector(doDelay:) withObject:object afterDelay:1.0];

【问题讨论】:

你不能有多个action目标;您需要有一种目标方法并根据按钮数在其中执行不同的操作。此外,将按钮直接添加到窗口并在应用程序委托中处理事件是非常不寻常的。您通常会使用 UIViewController 子类。如果您在创建新项目时选择“单一视图应用程序”,XCode 将为您设置所有这些。 为什么不能使用 NSTimer 而不是 performSelector:withObject:afterDelay: 您的要求是多动作.....?或第 3 步。第二次触摸 UIButton 时每 1 秒增加一次计数.....您再次说“计数将继续增加 1。我永远无法进入 [self performSelector:@selector(doDelay:) withObject :button afterDelay:1.0]." 【参考方案1】:

对于多个按钮操作,您必须删除按钮目标 doButton 并添加其他您想要的。对于您的案例,将您的计数传递给 doDelay 方法并将其添加到 afterDelay:

【讨论】:

【参考方案2】:

试试这个:

int count; 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    CGRect rect=[[UIScreen mainScreen] bounds];
    UIButton *button=[[UIButton alloc] initWithFrame:rect];
    button.backgroundColor=[UIColor redColor];
//Step (1)
    count = 0;
    [self updateButton:button];
    [self.window addSubview:button];
//Step (2) and (3)   
    [button addTarget:self action:@selector(doButton:) forControlEvents:UIControlEventTouchUpInside];

    return YES;    


-(void)updateButton:(UIButton *)button 
      NSString *s = [NSString stringWithFormat:@"Count = %i", count];
      [button setTitle:s forState:UIControlStateNormal];


-(void)doButton:(UIButton *)button

    count++;
    if(count == 1) 
      //Step(2)
      [self updateButton:button];
     else if(count == 2)
       //Step (3)
      [self performSelector:@selector(doDelay:) withObject:button afterDelay:1.0];
    

-(void)doDelay:(UIButton *)button

    count++;
    [self updateButton:button];
    [self performSelector:@selector(doDelay:) withObject:button afterDelay:1.0];

【讨论】:

【参考方案3】:

删除这一行

[self performSelector:@selector(doDelay:) withObject:object afterDelay:1.0];

并在您的代码中替换这两个操作....

-(void)doButton:(id)sender

    static int count;
    count++;
    NSString *s = [NSString stringWithFormat:@"Count = %i", count];
    UIButton *b = sender;
    [b setTitle:s forState:UIControlStateNormal];
    if (count == 2) 
        [NSTimer scheduledTimerWithTimeInterval:1.0
                                         target:self selector:@selector(doDelay:) userInfo:sender repeats:YES];

    

-(void)doDelay:(NSTimer *)timer

    [self doButton:timer.userInfo];

【讨论】:

以上是关于UIButton 多个事件的主要内容,如果未能解决你的问题,请参考以下文章

iOS 原生的 UIButton 点击事件是不允许带多参数的,唯一的一个参数就是默认UIButton本身 那么我们该怎么实现传递多个参数的点击事件呢?

向 UIButton 添加其他视图

具有多个动作的 UIButton:如何防止其他动作触发

第一个 UIButton 触发同一视图的另一个 UIbutton 事件

如何禁用标准 UIButton 触摸事件

UIButton 不响应触摸事件