2012-01-05 13 views
5

私はいくつかのアプリでこれを見てきましたが、これはかなり一般的なケースです。しかし、数日を過ごした後、私はまだこれで苦労しています。私は以下のような構造を持っています:ログアウト時にuiviewcontroller/unloadビューを解除する方法

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に

おかげ MBH

+0

(この場合、私は本当に[アダム・ケンプのアイディア]のように、私は、これはまさにあなたのケースのために働くだろうわからないんだけど、私はただログアウト時にpopToRootViewController' 'したかったhttp://forums.xamarin.com/discussion /あなたは 'UserDidLogOut'ため' NSNotificationCenter'イベントを追加し、そのイベントを処理示唆3749/popviewcontroller・オール・ウェイ・ツー・メイン画面のアプリ-rootviewcontroller)、**ビュー・コントローラー内。 – cloudrave

答えて

1

を使用していません。 releaseメソッドが呼び出されると、そのメソッドには、そのオブジェクトのすべてのリソースを解放するための文が含まれている必要があります(また、スーパークラスもdealloc)。

+0

これはどのように実現するのですか? [ctrl.visibleViewController release]?動作しません。 [ctrl release]?それも試みた。 – mbh

+0

ARCを使用していますか?あなたがいるなら答えは異なるかもしれません。 – Jim

+0

それを指摘してくれてありがとう。すべきである。私はその場合、ARC – mbh

1

両方のナビゲーションコントローラのrootViewControllerは、それぞれのTableViewコントローラです。だから私は、popToRootViewControllerは何もしないと思う。

おそらく、データをリセットして、ビューの割り当てを解除する代わりに、ビューを更新する必要があります。

+0

私は複数のtableViewControllerを持っています。したがって、私はUINavigationControllerを使用しました。そこで、Popはroot/top以外のすべてのビューコントローラをdeallocするのを助けました。どこで私はすべてのあなたの他のコントローラを再ロードするために少なくとも1つのビューコントローラを持つようにしたいので、あなたは、ルートビューコントローラを除くすべてのビューコントローラをDEALLOCでき – mbh

+0

DEALLOCすることができないという問題が生じています。 –

2

forループは、それぞれのUINavigationControllerルートにプッシュしたビューコントローラを解放して(つまり、いくつのタブがあるかによって)、つまりルートにポップバックしたときにスーパービューを持たないようにしますこれらは、自動的に割り当て解除されます。これらはあなたのUITableViewControllerが処理しています。

各UINavigationControllerについては、古いインスタンスを解放するためにタブバーコントローラが必要です。 IMHO、これはあなたがUITabBarControllerをリリースするときに行われるべきです。

これで、UITabBarController自体が残ります。私はそれがtbhを行うことができるとは思わない。あなたのコードはビューを削除するだけですが、タブバーコントローラ自体を無効にすることはありません。 Krishna K氏が指摘するように、他のすべてのものをリロードするには、少なくとも1つのView Controllerが必要です。 コードをappdelegateに入れるのは意味がありますが、logout()がUITableViewController2とUITabViewController2のどこかのUITableViewController2から呼び出されるので、UITabViewController2とUITabbarControllerの保持を行わないようにする必要があります。

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]; 
} 

しかし、私が言ったように、この時点ではメモリ管理の警告があるかもしれません。