菜鸟教程小白 发表于 2022-12-13 03:38:35

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


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

<pre><code>- (void)buttonAction{
    NSLog(@&#34;click!&#34;);
    button.enabled = NO;
    ;
}

- (void)longTask{
    NSLog(@&#34;task begin!&#34;);
    sleep(5);
    NSLog(@&#34;task finished!&#34;);
    button.enabled = YES;
}
</code></pre>

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

<pre><code>2013-08-20 09:24:49.478 AppName click!
2013-08-20 09:24:49.479 AppName task begin!
2013-08-20 09:24:54.481 AppName task finished!
2013-08-20 09:24:54.482 AppName click!
2013-08-20 09:24:54.482 AppName task begin!
2013-08-20 09:24:59.484 AppName task finished!
</code></pre>

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

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

<p>感谢任何帮助!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>sleep</code> 只是卡住了负责所有 UI 交互的主线程。 </p>

<p>您应该在后台执行所有长时间的任务,这可以通过 <a href="https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html" rel="noreferrer noopener nofollow">GCD</a> 轻松完成.只需像下面那样做,你应该能够实现你想要的:</p>

<pre><code>- (void)buttonAction{

    NSLog(@&#34;click!&#34;);
    button.enabled = NO;

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

      ;

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

- (void)longTask{
    NSLog(@&#34;task begin!&#34;);
    ;
    NSLog(@&#34;task finished!&#34;);

}
</code></pre>

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

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

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

<pre><code>- (void)buttonAction{

    NSLog(@&#34;click!&#34;);
    self.addCartButton.enabled = NO;
   ;
}

- (void)longTask{
    NSLog(@&#34;task begin!&#34;);
    [ runUntilDate:];
    NSLog(@&#34;task finished!&#34;);
   self.addCartButton.enabled = YES;
}
</code></pre>

<p>这两种方法都经过测试,似乎都有效。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在较长的任务时间内忽略UIButton的触摸事件,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18325602/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18325602/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在较长的任务时间内忽略UIButton的触摸事件