-1

私の iPad アプリケーションには、単一の UINavigationController と、タブとして機能する複数の viewController があります。タブに特定のカスタムルックが必要だったので、私は UITabbarController を使用していません。そのため、テーブルビュー全体とセルロジックをカプセル化する単一の UITableViewController のサブクラスであるさまざまなコントローラーをロードしています。画面の下部。

私が実装したデザインを見ると、[現在行っている]ビューをプッシュ/ポップする必要がなく、一度に1つのviewControllerを配置する必要がないため、navigationControllerは実際には必要ありません。

私が今やったことは次のとおりです。

  1. appDelegate の didFinishLaunchingWithOptions メソッドで、ナビゲーション コントローラーを次のように割り当てています。

    - (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をこのように初期化するのは間違っているようです.ルートView Controllerへの参照を保持しているため、以前のviewControllerで保持されていた参照カウントを気にせずに何度も初期化しています.

いつでも1つのviewControllerだけが必要なため、より良いアプローチは何でしょうか?

4

1 に答える 1

1

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

于 2011-07-08T09:40:27.597 に答える