簡體   English   中英

如何在注銷操作中取消分配uiviewcontroller / unload視圖

[英]How to dealloc uiviewcontroller/unload views on logout action

我認為這是一個非常常見的用例,因為我在幾個應用程序中看到過它。 但經過幾天的努力,我仍然在努力解決這個問題。 我有如下結構:

UITabBarController
-- UINavigationController1
 ---- UITableViewController1

-- UINavigationController2
---- UITableViewController2

現在我在UITableViewController2上有一個注銷按鈕。 當我點擊該注銷按鈕時,我想要取消分配所有和任何視圖控制器,所有視圖都被卸載。 基本上就像啟動應用程序一樣開始。 我基本上希望再次調用每個UITableViewController上的viewDidLoad。

在UITableViewController2上執行注銷操作時,我嘗試在appdelegate中調用以下方法。

-(void) logout {
    for (UINavigationController* ctrl in self.tabBarController.viewControllers) {
        [ctrl popToRootViewControllerAnimated:NO];
        ctrl.visibleViewController.view = nil;
    }

[self.tabBarController.view removeFromSuperview];
[self.window addSubview:self.tabBarController.view];

}

但是,唉,它似乎沒有用?

任何想法如何完成這樣的事情? 另外,我在iOS4和iOS5中看到了與visibleViewController不同的行為。 我這里沒有使用任何模態viewcontroller。 任何陷阱?

更新:我沒有使用ARC

謝謝你

你的for循環將釋放並因此釋放你已經推送到相應UINavigationController根目錄的任何視圖控制器(取決於你有多少個選項卡),即當你彈回到每個導航控制器的根時它們沒有超級視圖,這些是自動解除分配的。 這些是你的UITableViewControllers照顧。

對於相應的UINavigationControllers,您需要使用tabbar-controller來釋放舊實例。 恕我直言,當你發布UITabBarController時,這應該是你做的。

然后離開UITabBarController本身。 我認為不能做到這一點。 您的代碼將僅刪除視圖,但不會釋放tabbar控制器本身。 正如Krishna K指出的那樣,你需要至少一個視圖控制器來重新加載所有其他視圖控制器。 將代碼放入appdelegate是有道理的,但是你需要確保你的logout()不會導致UITableViewController2以及UITabbarController的保留,因為它是從某個地方的UITableViewController2調用的。

一個想法是探索,你的AppDelegate是否有一個實例到TabBar-Controller,你可以在從self.window中刪除視圖后釋放並創建一個新實例?

// manually create UITabBarController - AppDelegate holds instance
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil];
}

- (void) logout {
  [self.tabBarController.view removeFromSuperview];
  [mytabcontroller release];
  mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil];
  [self.window addSubview:self.tabBarController.view];
}

但正如我所說,此時可能會有關於內存管理的警告。

您需要釋放視圖控制器。 當調用它們的release方法時,該方法應該包含釋放其所有對象資源的語句(並且還釋放其超類)。

兩個導航控制器的rootViewController是它們各自的TableView控制器。 所以我不認為popToRootViewController會做任何事情。

您可能需要重置數據並刷新視圖,而不是取消分配視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM