2011-06-13 35 views
0

我在這個主題上看過很多文章,但沒有一篇讓我清楚地理解發生了什麼。dismissModalViewControllerAnimated mystery

我已經設置了一個涉及兩個UIViewControllers的小測試:MainController和ModalController。

MainController上有一個按鈕,利用以下簡單的代碼呈現一個模態視圖控制器:

ModalController *myModal = [[ModalController alloc] init]; 
[self presentModalViewController:myModal animated:YES]; 
[myModal release]; 

現在,如果我立即從相同的代碼塊內關閉此模態控制器,按照該下一line:

[self dismissModalViewControllerAnimated: YES]; 

模態視圖不排除。

繼本網站上的一些建議,我把dismissModalViewControllerAnimated呼叫在一個單獨的方法,我然後叫:

[self performSelector:@selector(delayedDismissal) withObject:nil 
    afterDelay:0.41]; 

這工作 - 至少,如果我做了延遲0.41或更高。 .40或更少,它不起作用。

在這一點上,我假設我在這裏處理一個需要趕上自己的運行循環,因爲缺乏更好的描述。該死的片狀,如果你問我,但c'est la vie。

所以,在接下來的測試中,我讓delayedDismissal做什麼 - 它只會提供延遲 - 並重新插入dismissModalViewControllerAnimated回撥原塊,這樣我的代碼現在看起來像這樣:

ModalController *myModal = [[ModalController alloc] init]; 
[self presentModalViewController:myModal animated:YES]; 
[myModal release]; 
self performSelector:@selector(delayedDismissal) withObject:nil 
     afterDelay:0.41]; // to create the false delay 
[self dismissModalViewControllerAnimated: YES]; 

...現在dismissModalViewControllerAnimated不再工作,無論我使用多長時間的延遲。

所以...有人會知道善意解釋這裏發生了什麼?我認識到,和其他人一樣,我可以通過各種解決方法實現自己的目標,包括使用委託等。但是我認爲,對於遇到此問題的每個人都應該徹底瞭解問題和適合此場景的解決方案。順便說一句,這種情況下的一個用例是在用戶沒有與該屏幕交互的情況下以模式呈現加載屏幕......它僅用於呈現信息,同時阻止用戶採取行動。

韋恩

回答

1

的觀點是動畫,因此只要是動畫呼籲解僱將無法正常工作。

另外,在第二件事情中,你嘗試了一個「延遲」,但實際上你做的是說下面的內容:「好的,這是一個可愛的方法,你可以在0.41秒後執行嗎?平均時間,稱這種方法..「

關閉模式視圖控制器應該通過用戶界面完成,通過點擊一個按鈕,所以你爲什麼試圖在第一個地方?

+0

首先,感謝我對第二個實驗的澄清。我的真正最終目標是使用模式形式在災難恢復場景中傳達有關長時間運行同步的信息(即應用程序在恢復同步完成之前無法使用)。我有理由選擇UIAlertView或UIActionSheet上的模態表單,但重點是,用戶不會與模態表單交互。應用程序本身必須關閉所述表單。事實是,我會以委託方式做到這一點,所以我懷疑我會遇到問題。但是,當我設置這個小... – wayne 2011-06-13 10:03:49

+0

...實驗,我很驚訝地看到這種行爲。關於「解僱一個模態視圖控制器應該通過用戶界面完成,點擊一個按鈕」的評論,你會如何建議我實現了我的目標?我有太多的信息要傳遞到UIAlertView或UIActionSheet中,我不希望用戶忍受嘗試與已損壞的應用程序進行交互的挫敗感,那麼在此類恢復過程中我有哪些其他選擇? – wayne 2011-06-13 10:07:57

+0

@wayne UIAlertView在被解僱之前還需要用戶操作,對嗎?然後在你的modalview上實現這樣一個按鈕!而且我個人認爲你不應該向iPhone用戶顯示如此多的數據,但是我再次不知道上下文。 – 2011-06-13 10:17:42