2011-11-08 47 views
0

所以我使用的子視圖包含一個標籤,活動指示燈和的UIImageView。我有它在一個子視圖,我默認時加載我隱藏它彈出子視圖。然而,子視圖並沒有隱藏自己,直到我完成後我需要完成的意義它顯示了約0.01秒,而不是我想要的時間設置隱藏屬性不會立即生效

我試過做這樣的事情。

do{ 
    loadingSubview.hidden=false; 
    }while(loadingSubview.hidden); 

要確定屬性是在繼續之前設置,但它會產生相同的結果是否有我做錯了什麼?

回答

1

你需要退出當前的方法(S)回運行循環任何UI更新發生。在

動做其他的東西這個UI更新後,以後在其他的NSTimer任務或其他動作延遲(只是一對夫婦幾十毫秒都行)。不要在方法中等待。

1

注意,對於大多數繪圖效果,繪製不會實時發生。大多數情況下,你告訴iOS要繪製什麼,並在你的方法失效之後在主事件循環中繪製它。所以你不能通過調試器看着它隱藏在視圖中的東西。

如果你想要的東西延遲反應,使用的一個:

[self performSelector:@selector(mydelayedtask) withObject:nil afterDelay:1.0f]; 

,這將給你一個1秒的延遲。

+0

我不想要一個延遲的反應就是這個問題,當我需要的時候它不會加載我的子視圖 – endy

+0

當你需要它顯示時,你忘了立即退出到運行循環。 – hotpaw2

2

貴「的問題」的根本原因是,你阻止事件循環無法處理其事件。繪圖就是其中之一。另外一個是用戶互動活動等,如果你真的想立即取消隱藏按鈕,你可以這樣做:

loadingSubview.hidden = NO; // why "false"??? :) 
[self performSelector:@selector(timeConsumingStuff) 
      withObject:nil 
      afterDelay:0]; // 0 is good here == "when idle" 

你可以肯定你的按鈕,但它不會響應(以及其他)直到耗時完成。

另一個解決方案是明確的進程中運行循環的事件。 (看看[NSRunLoop runMode:beforeDate:]。但是......除非你把耗時的東西移到另一個線程上,否則將會有一個懲罰