2013-05-31 81 views
1

即時通訊我試圖在我的屏幕上突出按鈕,我想改變他們的背景圖像,等待幾秒鐘,恢復背景圖像和下一個按鈕相同。屏幕上的高亮按鈕

從來就寫了這個代碼:

-(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

需要在主線程上對UI進行更改。如果在任何其他線程上進行創建,它們將產生不可預知的結果。你可以使用計時器來做同樣的事情。 – Amar

+0

有沒有答案幫助你?如果是這樣,請將其標記爲已接受的答案,或者上傳它是否有幫助,但不是正確的答案。這將幫助您建立聲譽,並鼓勵他人回答您的問題。否則,您可以對答案或您的問題發表評論以獲得更多清晰度。謝謝! – stevekohls

回答

1

不能從後臺線程改變UI的屬性,這會導致各種問題,包括崩潰。爲了保持您的原始算法,您可以將UI更新發送回主線程。但是這不是一個非常有效的線程使用,只需使用一個簡單的NSTimer就可以在主線程上運行。

0

如前所述,在主線程上執行所有UI更改。這是一個完成你想要做的事情的選項,不需要NSTimer。

-(void)animateButtons 
{ 
    for (...) 
    { 
     // set focused state 
    } 

    [self performSelector:@selector(restoreButtons) withObject:nil afterDelay:2.5]; 
} 

-(void)restoreButtons 
{ 
    for (...) 
    { 
     // set normal state 
    } 
}