【问题标题】:How to Force UIButton to Refresh?如何强制 UIButton 刷新?
【发布时间】:2009-10-25 20:52:54
【问题描述】:

我正在按照以下方式工作 sn-p:

for (UIButton *b in buttonMapping) {
    [b setTitle:@"yo!" forState:UIControlStateNormal];
    [NSThread sleepForTimeInterval:1.0];
}

有四个按钮,所有四个按钮都会更新。然而,不是每秒更新一个,而是四秒钟过去了,它们都更新了。

如何强制 UIButton 更新?或者这不是推荐的睡觉方法?

【问题讨论】:

  • 记得在主线程上保持 UI 更新

标签: iphone objective-c cocoa-touch


【解决方案1】:

[b setNeedsDisplay];

我也不建议让主线程休眠(就像您在这里所做的那样),因为这会禁用所有用户交互。

有几种选择。一种可能是使用NSTimer 每秒执行一次特定方法。但是,更简单的方法是执行以下操作:

for (NSUInteger idx = 0; idx < [buttonMapping count]; idx++) {
  UIButton * b = [buttonMapping objectAtIndex:idx];
  [b performSelector:@selector(setNormalStateTitle:) withObject:@"yo!" afterDelay:(idx*60)];
}

然后向 UIButton(即类别)添加一个名为 setNormalStateTitle: 的方法,该方法简单地执行 setTitle:forControlState: 方法。使用这种方法,您根本不需要 setNeedsDisplay 方法。

【讨论】:

  • UIButton 似乎没有响应 setNeedsDisplay。
  • 抱歉,应该是setNeedsDisplay,而不是setNeedsDisplay:YES。编辑答案。
  • 谢谢。更改为 setNeedsDisplay 编译,但行为是相同的。四秒钟后,任何按钮都明显改变了。
  • @Bill 那么我会采用performSelector:withObject:afterDelay: 方法。因为休眠主线程确实不是一个好主意。
  • 这适用于这个例子,但我真正想做的是向用户展示一系列按钮来按下(一个简单的老式西蒙游戏)。因此,我真正想做的不是设置标题,而是突出显示按钮几百毫秒,取消突出显示它,然后转到下一个按钮。学习 performSelector 方法其实很酷,但是这里会让事情变得复杂很多。
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 2010-11-16
  • 2015-11-25
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多