ios - 如果 for 循环正在运行,则无法按 UIButton

标签 ios objective-c cocoa-touch uibutton

这非常奇怪,我确信我在这里遗漏了一些基本的东西。

我有的是

  • 两个 UIButton:button1、button2
  • Touchdown 按钮 1 有一个名为 startAction 的 IBAction
  • Touchdown Button2 有一个名为 cancelAction 的 IBAction
  • 在 Storyboard中创建了这一切

发生的情况是,当我按下按钮1时,for循环开始。在这个 for 循环结束之前,我无法再按屏幕上的任何按钮,即我无法按下按钮 2。

我怎样才能做到这样,当我按下按钮1时,我仍然能够通过按下按钮2来取消按钮1的for循环操作。这是我的代码

static bool scanCancelled = NO;

-(IBAction)startAction
{
    for (int i=0; i<5000; i++)
    {  
        NSLog(@"i: %d ...", i);

        if (scanCancelled == YES)
        {
            break;
        }
    }//end for-loop
} 

-(IBAction)cancelAction
{
    scanCancelled = YES;
}

对于任何对 future 感兴趣的人,我就是这样做的

-(IBAction)startAction2
{
    //reset it
    scanCancelled = NO;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                             (unsigned long)NULL), ^(void) {
        [self startAction];

    });

}

最佳答案

正如其他人所说,您必须使用另一个线程/进程来运行长时间运行的 for 循环,以便 UI 可以继续处理事件等。

但我不建议使用 iOS 中的线程类,除非您习惯多线程*,否则这看起来有点迟钝,相反我建议使用 Grand Central Dispatch:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

使用它非常简单,并且会向您介绍非常强大的 block 。这是一个入门教程:http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

*综上所述,您应该研究典型的线程模型及其工作原理。这些概念的使用远远超出了 iOS 和 Objective-C。

关于ios - 如果 for 循环正在运行,则无法按 UIButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18788538/

相关文章:

ios - 当我只使用 2 个时选择器要求 3 个参数

ios - 为什么 UIViewController View 坐标是 (0,20) 以及如何更改 (iPad)

iOS 13performActionForshortcutItem 现在不会在启动时在 SceneDelegate 中调用,而是在应用程序启动后调用。为什么?

objective-c - 将应用上传到商店后 iAd 不会显示

iphone - 在 UISearchBar 和 UITableView 上面添加 UILabel 就像 WhatsApp 联系人

ios - CLLocationManager 和串行位置更新处理

ios - 如何更改 Apple Watch 的 WKInterfaceImage 对象的框架或大小?

ios - 如何在将数据传递给 viewController 时实例化 navigationController?

objective-c - 如何在使用 Grand Central Dispatch 处理某些内容时以模态方式正确显示 "progress"工作表?

ios - Swift 中的动态标签不滚动