【问题标题】:How to increase int value with iteration while button is pressed按下按钮时如何通过迭代增加int值
【发布时间】:2014-08-23 13:08:49
【问题描述】:

我正在使用界面生成器,现在为了完成我在 xcode 中的第一个应用程序,我有一个问题我没有找到解决方案:如何在按下 UIButton 时通过迭代增加 int 值?

我尝试了很多解决方案,但在最好的情况下,我尝试过迭代是无限的,例如我有两种方法(Touch Up inside 和 Touch down)改变一个 bool 值(如果 down bool=true 并进行迭代; 如果它成立 bool=false 并停止迭代)。

在控制台打印我有同样的无限结果:“DOWN,TRUE”

那么,我该怎么做呢?

非常感谢。

【问题讨论】:

  • 你想实现当你按下按钮时计数器自动增加吗?
  • 永远循环会阻塞应用程序。查看计时器。
  • 是的,我想要那个@holex
  • 这就是为什么我需要解决这个问题@CrimsonChris

标签: ios objective-c uibutton interface-builder


【解决方案1】:

最有可能发生的事情是您的循环正在 UI 线程上运行。这意味着 UI 线程将被您的循环消耗,直到您的循环完成。完成循环的唯一方法是触发 Touch Up Inside 方法。但是,此事件是在 UI 线程上创建的,该线程当前正忙于您的循环。

您需要使用后台线程来创建您的 int 值并打印到控制台。这样,当Touch down事件被触发时,循环将被推到后台,UI线程可以继续处理未来的触摸事件。

Apple 开发者网站上的 Thread management 文档是一个很好的资源:

不用太担心并发编程,这里有一个简单的例子来说明可行的方法。

int i = 0;
bool cancelLoop = NO;

- (IBAction)touchDown:(id)sender {
    // Run in background so that the UI thread can continue to process touch events.
    [self performSelectorInBackground:@selector(startLoop) withObject:nil];
}

- (IBAction)touchUpInside:(id)sender {
    [self cancelLoop];
}

- (void)startLoop {
    cancelLoop = NO;
    while(!cancelLoop) {
        NSLog(@"%d", i++);
    }
}

- (void)cancelLoop {
    cancelLoop = YES;
}

【讨论】:

  • 谢谢,让我读一下。如果我对此有任何疑问,您能帮我吗??
  • 谢谢!它就像一个魅力,我只在一个完美的函数中添加了一行代码: - (IBAction)touchDown:(id)sender { // 在后台运行,以便 UI 线程可以继续处理触摸事件。取消循环=假; [self performSelectorInBackground:@selector(startLoop) withObject:nil];这将允许重复使用它,直到达到所需的值。
【解决方案2】:

如果你有 action 方法,那么只需声明实例变量就可以了

  @property(assign)NSUInteger i;

现在将操作方法​​连接到 UIButton,当它单击时,只需在操作方法中迭代您的 i 变量,如下所示:-

  _i++;

【讨论】:

  • 增量的东西对我来说不是问题,我的问题是当按下按钮时如何循环,当按下按钮时停止循环。
  • OP 希望值在按下按钮时不断增加。我认为使用计时器的解决方案会更合适。
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多