-1

私のiPadアプリケーションでは、単一のUINavigationControllerと複数のviewControllersがタブとして機能しています。私はUITabbarControllerを使用していません。なぜなら、タブのカスタム見た目が必要だったからです。テーブルビュー全体をカプセル化する単一のUITableViewControllerのサブクラスである異なるコントローラをロードしていました。画面の下部に表示されます。iPhoneのデザインパターンとメモリ管理の問題

私が実装した設計を見ると、実際にはnavigationControllerは必要ありません。私はビューをポップ/ポップする必要はありません。 。

私が今行っていることである。

私のappDelegateの私のdidFinishLaunchingWithOptionsメソッドで
  1. 、私は私のナビゲーションコントローラを割り当てています:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    
    UINavigationController *navigationVC = [[UINavigationController alloc]init]; 
    navigationVC.navigationBarHidden = YES; 
    navigationVC.navigationBar.barStyle = UIBarStyleBlack; 
    self.navigationController = navigationVC; 
    [window addSubview: [self.navigationController view]]; 
    [navigationVC release]; 
    
    //set orientation as portrait 
    self.currentOrientationType = PORTRAIT; 
    
    //start with launch screen view controller 
    [self setViewController:LAUNCH param:nil]; 
    
        return YES; 
    } 
    

そして、私の方法でsetViewController :param:、渡されたIDに応じて、適切なviewControllerを次のようにロードしています:

- (void)setViewController:(NSString *)ID param:(NSString *)param { 

UIViewController *viewController; 

    if(ID == HOME) { 
     viewController = [[HomeScreenViewController alloc]initWithNibName:@"HomeScreenViewController" bundle:nil]; 
    } 

    else if(ID == ...){ 
    } 

    ... 

    //push the specified view controller 
[self setTransitionType:nil]; 

[[self navigationController] initWithRootViewController:viewController]; 
[viewController release]; 
    } 
} 

何が起こっているのかは、rootViewControllersが割り当て解除されていないので、私のviewControllersのいずれかがそういうことです。それは、新しいViewControllerごとに毎回navigationControllerを初期化すると、ルートビューコントローラへの参照が保持され、以前のviewControllerで保持していた参照カウントを何度でも初期化するため、間違っているようです。

任意の時点で1つのviewControllerしか必要ないので、より良いアプローチは何でしょうか?

答えて

1

Appleのドキュメントによると、initWithRootViewControllerはナビゲーションコントローラの新しいインスタンスを作成します。 setViewControllerメソッドを呼び出すたびに、ナビゲーションコントローラの新しいインスタンスを作成しています。代わりに、initWithRootViewControllerで作成し、それからアクティブにするビューに対してPushViewControllerメソッドを使用する必要があります。