2012-01-02 49 views
10

我正在使用UIWebView,並且不希望導航欄出現,除非用戶在屏幕上的任何地方點擊不是鏈接。 所以我有這樣的代碼顯示的延遲後的導航欄:cancelPreviousPerformRequestsWithTarget未取消未完成的performSelector:withDelay

- (void)handleTapGesture:(UITapGestureRecognizer *)sender 
{  
.... 
[self performSelector:@selector(showNavigationBar) withObject:self afterDelay:0.2]; 
} 

我沒有打電話showNavigationBar立即當輕敲處理程序被調用,因爲用戶可能有一個鏈接上點擊在這種情況下,自來水處理程序被稱爲之前UIWebViewshouldStartLoadWithRequest,所以如果我隱藏導航欄shouldStartLoadWithRequest它會瞬間閃爍到屏幕上。 因此,我將其設置爲在延遲後顯示,以便在shouldStartLoadWithRequest內執行以下代碼(並且如果用戶未點擊鏈接shouldStartLoadWithRequest未被調用並顯示導航欄,因爲它應該是在這種情況下)。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:nil]; 
... 

但是這是行不通的,我已經增加了延遲時間幾秒鐘,可以確認cancelPreviousPerformRequestWithTarget已經顯示在導航欄之前獲取調用,但在指定的時間經過的欄顯示。 cancelPreviousPerformRequestWithTarget不起作用。

有人知道爲什麼它不工作?

回答

9

在這種+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument方法documentation有這樣一句話:

這種方法只刪除當前運行的循環,並不是所有的運行循環執行請求。

如果我正確解釋它,這意味着你需要在你啓動它的同一個運行循環中取消你的動作。這顯然不是你想要做的。

一種方法來解決這個問題將是一個標誌,showNavigationBar將不得不檢查,看它應該繼續還是中止。

+0

我給一個嘗試。是否有取消變體適用於所有運行循環?我試過這個,但它也不起作用:[[NSRunLoop mainRunLoop] cancelPerformSelector:@selector(showNavigationBar)target:self argument:nil]; – Gruntcakes 2012-01-02 05:46:53

+0

@Piepants我不這麼認爲,但那並不意味着沒有。 – 2012-01-02 05:51:33

+0

有同樣的問題和標記是要走的路! – durazno 2016-05-20 13:19:09

14

您的表演與您的取消不符。在執行你傳遞自己的對象:

[self performSelector:@selector(showNavigationBar) withObject:self afterDelay:0.2]; 

在取消你傳遞零的對象:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:nil]; 

他們不匹配,所以延遲執行不應該被取消。

+2

我只是這樣做,沒有運氣。所以我試圖刪除所有請求:[NSObject cancelPreviousPerformRequestsWithTarget:self];現在它像一個魅力。 – 2012-03-30 10:51:32

+0

爲了擴展Dave的說法,原始調用中的withObject是用於方法參數的。如果沒有,那麼它應該是零。如果有一些則showNavigationBar需要冒號:在它之後,第一個參數是第一個withObject。 – JScarry 2013-06-24 21:51:58

2
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:self]; 

爲我工作;)

+0

它對我很好=)=) – 2015-01-23 09:30:32