我试图突出我的屏幕上的按钮,我想改变他们的背景图像,等待几秒钟,恢复背景图像和下一个按钮相同。
我写了这段代码:
-(void)animateButtons
{
UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, scroll.frame.origin.y-20, [UIScreen mainScreen].bounds.size.width, 20)];
[lbl setTextAlignment:NSTextAlignmentCenter];
for(int c=0;c<arr.count&&animationRunning;c++)
{
MenuItem * m = [arr objectAtIndex:c];
[lbl setText:m.name];
MyButton * b = (MyButton*)[self.view viewWithTag:c+1];
NSMutableString * str = [[NSMutableString alloc]initWithString:m.image];
[str appendString:@"_focused.png"];
[b setBackgroundImage:[UIImage imageNamed:str] forState:UIControlStateNormal];
sleep(2.5);
str = [[NSMutableString alloc]initWithString:m.image];
[str appendString:@"_normal.png"];
[b setBackgroundImage:[UIImage imageNamed:str] forState:UIControlStateNormal];
if(c==arr.count-1)
{
animationRunning=false;
}
}
}
以这种方式调用的方法,因此它不会阻止UI线程。
[NSThread detachNewThreadSelector:@selector(animateButtons) toTarget:self withObject:nil];
但它只是改变了第一个按钮背景,然后没有改变。
使用NSLog我可以看到该方法仍在运行,但按钮没有变化。
我怎样才能实现这个目标?
谢谢,抱歉我的英语不好。
答案 0 :(得分:1)
您无法从后台线程更改UI属性,这会导致各种问题,包括崩溃。要保留原始算法,您可以将UI更新分发回主线程。但这不是一个非常有效的线程使用,只需使用在主线程上运行的简单NSTimer。
答案 1 :(得分:0)
如前所述,在主线程上执行所有UI更改。这是一个完成你要做的事情的选项,不需要NSTimer。
-(void)animateButtons
{
for (...)
{
// set focused state
}
[self performSelector:@selector(restoreButtons) withObject:nil afterDelay:2.5];
}
-(void)restoreButtons
{
for (...)
{
// set normal state
}
}