首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

iOS 通訊軟體架構:保持 UIView 狀態的導航控制器模式

     編輯:程式設計疑難解答

問題場景

首頁 → 通訊介面(含 Switch 開關),按返回鍵回首頁,再次進入通訊介面時希望保持原有 UIView 實例與狀態(Switch 狀態、連線資訊),而非重新初始化。

核心解法:複用 ViewController 實例

使用 UINavigationController 推疊時,不要每次都 new 新實例,而是持有強引用複用。

實作範例

// RootViewController.h
@property (nonatomic, strong) CommunicationViewController *commVC;

// RootViewController.m
- (void)gotoCommunication {
    if (!self.commVC) {
        self.commVC = [[CommunicationViewController alloc] init]; // 首次建立
    }
    [self.navigationController pushViewController:self.commVC animated:YES];
}

為什麼有效?

  • pushViewController: 只負責將既有 VC 推入導航堆疊,不會觸發 viewDidLoad(僅觸發 viewWillAppear/viewDidAppear)。
  • VC 的屬性(Switch 狀態、Socket 連線等)保留在實例中,再次顯示時自動恢復。
  • 返回鍵預設行為是 popViewControllerAnimated:,只會移除視圖層級,不會釋放 VC 實例(除非記憶體警告觸發 didReceiveMemoryWarning 釋放可重建資源)。

進階:Storyboard / XIB 場景

  • 若用 Storyboard Segue,預設每次 Segue 都會 instantiateViewController 產生新實例。
  • 解法:取消 Segue,改用程式碼 instantiateViewControllerWithIdentifier: 並持有引用,或實作 prepareForSegue: 檢查是否已存在實例並手動指派。

架構建議

將通訊邏輯(Socket、狀態機)封裝在獨立的 CommunicationManager 單例或 Service 層,VC 僅負責 UI 綁定。如此即使 VC 被釋放重建,核心狀態仍在 Manager 中保持,解耦更徹底。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved