2013-04-23 60 views
0

我正嘗試創建類似於UIAlertView的我自己的視圖。我通過添加一些子視圖到我的自定義視圖,然後將我的自定義視圖作爲子視圖添加到[[[UIApplication sharedApplication].delegate window]中,完成了大部分工作。一旦按下警報視圖中的按鈕,我也實現了我自己的委託從窗口中刪除視圖。使用Grand Central Dispatch和UINavigationController的用戶界面問題

當委託視圖控制器加載時,它在後臺運行一個方法,一旦完成,我在主隊列上運行一個updateUI方法。在這個updateUI方法中顯示了警報視圖。我做到這一點使用GCD:

dispatch_async(dispatch_get_main_queue(), ^{ [self updateUI]; }); 

是我遇到的問題是,我的代表是嵌入在導航控制器視圖控制器,當我按下「返回」鍵,彈出該委託視圖控制器關閉之前後臺方法完成後,警報視圖將顯示在父視圖控制器上。在警報視圖中按下按鈕不會執行任何操作,因爲代理現在不在導航控制器堆棧中。

有誰知道爲什麼這個警報視圖仍然顯示,我怎麼能防止這種情況發生?我認爲關閉代理視圖控制器會阻止它的updateUI方法被調用,但它看起來好像是無論如何。

回答

0

當您的視圖控制器從導航堆棧中刪除時,它很可能仍然由您在後臺運行的塊保留。因此,儘管不在屏幕上,它仍然會收到您的消息。

如果我已經正確理解了你,你正在爲你的應用程序窗口添加一個子視圖。這就解釋了爲什麼即使您的視圖控制器不在屏幕上,您的自定義警報視圖仍然存在。

不一定是最好的,但是避免顯示警報視圖的一種方法是檢查視圖控制器視圖的超級視圖。如果超級視圖是,您的視圖控制器不可見,您可以有效地避免顯示警報。

+0

感謝您的回答。在閱讀您的回覆之後,我嘗試了對塊中的變量進行弱引用,但我還沒有弄清楚如何使這種方法奏效。但檢查視圖的超級視圖效果很好。再次感謝。 – Kevin 2013-05-03 18:47:16

相關問題