Objective C - 循环更改标签文本

发布于 2024-11-15 11:44:23 字数 269 浏览 3 评论 0原文

我有一个看起来像这样的循环

for(int x=0; x < 10; x++){
    [testLabel setText:[self randomString]];
    sleep(1);
}

randomString 是一种从数组返回随机字符串的方法。

我正在使用睡眠,所以实际上可以看到标签被更改。

循环工作正常,但标签仅在循环的最后一次迭代后更新。

有谁知道为什么会这样?有办法解决吗?

i have a loop that looks like this

for(int x=0; x < 10; x++){
    [testLabel setText:[self randomString]];
    sleep(1);
}

The randomString is a method where it returns a random string from an array.

I'm using sleep so it is actually possible to see the label being changed.

The loop works fine but the label only gets updated after the last iteration from the loop.

Does anyone know why this could be? And would there be a way to fix it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

中性美 2024-11-22 11:44:23

不要

在主线程上调用 sleep() ,并且在辅助线程中使用 sleep() 通常是非常值得怀疑的。

在这种情况下,只需使用 NSTimer 实例定期更新值(正如 Wilbur 所说)。

Do not call sleep()

Certainly not ever on the main thread and any use of sleep in secondary threads is generally highly questionable.

In this case, just use an NSTimer instance to periodically update the value (as Wilbur said).

友欢 2024-11-22 11:44:23

UI 仅在运行循环结束时更新,您的循环在单次迭代内运行。您应该使用 NSTimer 相反。

The UI is only updated at the end of a run loop, of which your loop is running inside of a single iteration of. You should be using an NSTimer instead.

不羁少年 2024-11-22 11:44:23

要获得更新,您应该单独运行它:

for(int x=0; x < 10; x++){
    [self performSelectorOnMainThread:@selector(updateLabel) withObject:nil waitUntilDone:NO];
    sleep(1);
}

- (void) updateLabel {
    [testLabel setText:[self randomString]];
}

To get updated you should run it separately:

for(int x=0; x < 10; x++){
    [self performSelectorOnMainThread:@selector(updateLabel) withObject:nil waitUntilDone:NO];
    sleep(1);
}

- (void) updateLabel {
    [testLabel setText:[self randomString]];
}
没企图 2024-11-22 11:44:23

最好在后台线程上运行字符串,

[self performSelectorInBackground:@selector(updateBusyLabel:) withObject:[NSString stringWithFormat:@"Processing ... %i",iteration]];

-(void)updateBusyLabel:(NSString *)busyText {
    [_busyLabel setText:busyText];
}

我不会使用 sleep(),而且计时器的工作量太大。

It's better if you run your string on a background thread

[self performSelectorInBackground:@selector(updateBusyLabel:) withObject:[NSString stringWithFormat:@"Processing ... %i",iteration]];

-(void)updateBusyLabel:(NSString *)busyText {
    [_busyLabel setText:busyText];
}

I wouldn't use sleep(), and the timer is too much work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文