2014-02-06 100 views
2

我正在爲iOS平臺編寫一個回合制遊戲。客戶端使用CocoaAsyncSocket API與遠程服務器進行通信。現在我正在處理這種情況:客戶端暫時處於非活動狀態,並且由於超時而與服務器斷開連接。如果是這種情況,我希望在應用程序進入前臺時彈出登錄視圖,讓用戶重新登錄。回到根視圖控制器

我假設我必須在我的應用代理的- (void)applicationWillEnterForeground中完成這類工作。檢查我是否連接不是問題,但我不知道如何解除每個呈現視圖控制器將我帶回根視圖(恰好是登錄視圖)。

我的視圖控制器是以模態方式呈現的,但我也有兩個帶有表格視圖的導航控制器,包括push segues。

任何有關這個問題的幫助,高度讚賞。提前致謝!

+1

描述你的視圖控制器。什麼是根視圖控制器(導航控制器,自定義)?風險投資者是否推動/呈現? – Wain

+0

現在編輯,Wain。 –

+0

只是一個理智檢查 - 你嘗試UINavigationController的 - (NSArray *)popToRootViewControllerAnimated :(布爾)動畫? – rist

回答

3

這樣做的震撼性方法就是用新的登錄視圖控制器替換rootViewController。

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    if ([self isDisconnected]) { 
     self.window.rootViewController = [MyLoginController new]; 
    } 
} 

對於故事板,假設您的初始故事板是登錄故事板。

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    if ([self isDisconnected]) { 
     UIStoryboard *storyboard = self.window.rootViewController.storyboard 
     self.window.rootViewController = [storyboard instantiateInitialViewController]; 
    } 
} 

根據您的UX,這可能會也可能不合適。

2

如果您的所有內容視圖模式方式從根視圖控制器(不聽起來像一個偉大的想法),然後呈現在應用委託(確實是在applicationWillEnterForeground),

// if we need to login 
UIViewController *rootViewController = self.window.rootViewController; 
[rootViewController dismissViewControllerAnimated:YES completion:nil]; 

如果根視圖控制器不是以模態方式呈現,那麼您需要以適當的方式解除視圖。如果任何其他'孩子'視圖控制器以模態方式呈現,那麼它應該解僱。我想解僱時,視圖控制器改變父視圖控制器將工作。您可能需要添加通知以通知所有視圖控制器,所有視圖都被拆除。

+0

謝謝。只是一個問題 - 爲什麼從根視圖呈現所有模態是不好的主意?我有一個視圖層次結構,所有視圖都建立在根視圖頂部的堆棧上。你會怎麼做? –

+0

如果嵌套模式顯示(並排除錯誤級別的錯誤),則可能會輕易地無意中解散整個應用內容。測試應該抓住這一點,但比推入或自定義子視圖更容易出錯。我不知道你的應用程序,但我會考慮自定義容器視圖控制器或導航控制器。 – Wain

相關問題