• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 在较长的任务时间内忽略UIButton的触摸事件

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:38:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想在长任务运行时忽略按钮的所有触摸事件。

- (void)buttonAction{
    NSLog(@"click!");
    button.enabled = NO;
    [self longTask];
}

- (void)longTask{
    NSLog(@"task begin!");
    sleep(5);
    NSLog(@"task finished!");
    button.enabled = YES;
}

在 longTask 期间,我再次单击按钮,它真的没有任何反应。但是,当 longTask 完成后,它会自动响应点击事件并再次执行 longTask! 当按钮的启用值为'NO'时,我点击了多少次,longTask将执行多少次。

2013-08-20 09:24:49.478 AppName[2518:c07] click!
2013-08-20 09:24:49.479 AppName[2518:c07] task begin!
2013-08-20 09:24:54.481 AppName[2518:c07] task finished!
2013-08-20 09:24:54.482 AppName[2518:c07] click!
2013-08-20 09:24:54.482 AppName[2518:c07] task begin!
2013-08-20 09:24:59.484 AppName[2518:c07] task finished!

我尝试设置 userInteractionEnabled=NO 但得到了相同的结果。

当一个长任务正在运行并且从不执​​行任务时,如何让它忽略所有触摸事件?换句话说,只有在单击按钮时才执行longTask,它的启用值为'YES'?

感谢任何帮助!



Best Answer-推荐答案


sleep 只是卡住了负责所有 UI 交互的主线程。

您应该在后台执行所有长时间的任务,这可以通过 GCD 轻松完成.只需像下面那样做,你应该能够实现你想要的:

- (void)buttonAction{

    NSLog(@"click!");
    button.enabled = NO;

    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        //Background Thread

        [self longTask];

        dispatch_async(dispatch_get_main_queue(), ^(void){
             button.enabled = YES;
        });
    });
}

- (void)longTask{
    NSLog(@"task begin!");
    [NSThread sleepForTimeInterval:5];
    NSLog(@"task finished!");

} 

请注意,当您这样做时,您的所有 UI 都不会再被阻止,只会禁用所需的按钮。

正如@Erik Godard 所提到的,您确实应该考虑在执行此类任务时使用某种 UI 反馈。您可以在将按钮的启用属性设置为 NO 的同一区域启动一些进程指示器,并在将属性设置为 YES

时停止它

另一种不使用 GCD 的方法是通过 NSRunLoop 的方法 runUntilDate 更改 sleep 。这样你的主线程也不会被阻塞,你就可以实现你想要的。

- (void)buttonAction{

    NSLog(@"click!");
    self.addCartButton.enabled = NO;
   [self longTask];
}

- (void)longTask{
    NSLog(@"task begin!");
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
    NSLog(@"task finished!");
   self.addCartButton.enabled = YES;
} 

这两种方法都经过测试,似乎都有效。

关于ios - 在较长的任务时间内忽略UIButton的触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18325602/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap