在我的iPad应用程序中,我有一个UINavigationController和多个viewControllers充当选项卡。我没有使用UITabbarController因为我想要某些自定义查找选项卡,所以一直在加载不同的控制器,这些控制器是单个UITableViewController的子类,它封装了整个tableview和单元格逻辑,点击图标按钮作为选项卡。屏幕的底部。
看看我实现的设计我真的不需要一个navigationController,因为我不需要推送/弹出视图[我现在正在做的]并希望一次只有一个viewController。
我现在所做的是:
在我的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];
}
}
正在发生的是我的任何viewControllers,因为rootViewControllers没有被取消分配。似乎每次为每个新的viewController启动navigationController都是错误的,因为它保留了对其根视图控制器的引用,并且我一次又一次地初始化它而不关心它保留在早期viewController上的引用计数。
什么是更好的方法,因为我想在任何时间点只有一个viewController?
答案 0 :(得分:1)
根据Apple文档,initWithRootViewController创建了一个新的导航控制器实例。每次调用setViewController方法时,都在创建一个新的导航控制器实例。相反,您需要使用initWithRootViewController创建一个,然后使用PushViewController方法为您想要成为活动视图的视图。