我的应用程序有一个标签栏控制器,其中一个标签项是一个拆分视图控制器。它的主视图控制器(即索引0)是一个从笔尖加载的导航控制器,因为它是自定义导航栏。
如果这听起来有点模糊,那么它可以归结为1)无法在IB中向TBC添加SVC以及2)iOS 4.2 splitview-navbar-colorTint错误。实际上,只有在昨天实施解决方法之后,我才遇到内存不足警告的问题。
在解决方法之前,我在SVC中安装了2个导航控制器,并以编程方式将其添加到TBC(由于IB对标签栏的限制),没有和问题 - 除了苹果bug之外。
即使在内存不足警告之后,小workaround demo也能正常工作。但它不涉及标签栏的额外开销。
但在my adaption of the workaround demo中,它开始变得梨形。在显示拆分视图时发送低内存警告,整个左侧(主视图)消失。设备上的行为相同,事实上我首先在那里发现了它。
我很困惑发生了什么事。显示视图(nav cont的根视图)由表视图子类控制。我已经覆盖了didReceiveMemoryWarning,但这没有用。此外(相应地!),superview不是零。这是一个UITableView。完全正确。
所以,我认为导航控制器正在发布?但是哪里?为什么不在原始演示?现在的区别是添加了标签栏控制器。这是我的代码,它将它添加到标签栏:
- (void) addTabItemSplitViewWithNavConRoot:(BOOL)hasRootNC {
// init master/detail views
SV1RootViewController *rvc = [[SV1RootViewController alloc] initWithNibName:@"SVC1RootView" bundle:nil];
SV1DetailViewController *dvc = [[SV1DetailViewController alloc] initWithNibName:@"SVC1DetailView" bundle:nil];
rvc.detailViewController = dvc;
UINavigationController *nc = nil;
if (hasRootNC) {
nc = [self.pSVC1.viewControllers objectAtIndex:0];
nc.viewControllers = [NSArray arrayWithObjects:rvc, nil];
nc.navigationBar.tintColor = [UIColor redColor];
} else {
nc = nil;
}
UIViewController *vc = (hasRootNC)? (UIViewController*)nc :rvc;
UISplitViewController *svc = [self newSplitViewControllerWithMasterVC:vc detailVC:dvc];
svc.delegate = dvc;
// init the tab bar item
svc.tabBarItem = [[UITabBarItem alloc] initWithTitle:(hasRootNC)? @"SplitView with Nav Root":@"Simple SplitView"
image:nil
tag:0];
// int the split view
NSMutableArray *controllersArray = [NSMutableArray arrayWithArray:self.pTabBarController.viewControllers];
[controllersArray addObject:svc];
[self.pTabBarController setViewControllers:controllersArray];
// cleanup
[nc release];
[rvc release];
[dvc release];
[svc release];
}
- (UISplitViewController*) newSplitViewControllerWithMasterVC:(UIViewController*)masterView
detailVC:(UIViewController*)detailView {
UISplitViewController *svc = [[UISplitViewController alloc] init];
NSMutableArray *controllersArray = [NSMutableArray arrayWithObjects:masterView, detailView, nil];
[svc setViewControllers:controllersArray];
return svc;
}
有人对我有想法吗? :)
这让我疯了!!!
答案 0 :(得分:1)
解决了它。曾经用编程初始化分割视图控制器的那种奇怪的混合,但是从主窗口xib读取导航控制器(所有这些都是因为Apple bug需要的自定义工具栏)。但我的猜测是,xib的导航控制器正在卸载它的视图。
所以现在我只是从笔尖拿出整个SVC,而不是手工构建它。实际上更整洁,更简单。
哦,伙计。我被an answer to this question误导了('指定'答案!)。我现在只是注意到这个更简单的方法也作为答案给出,实际上是最受欢迎的。完全忽略了它! ^^
答案 1 :(得分:0)
在没有看到所有代码的情况下,我猜测在mem警告期间非活动视图被破坏了。 (代表'didReceiveMemoryWarning'的代码,你可能有[super didReceiveMemoryWarning])
您需要确保在loadView方法中,任何需要添加的子视图都会重新添加到视图中,并相应地进行布局。希望有所帮助。
或者,如果你匆忙或懒惰,只要防止所有常见的事情发生。这可能很糟糕并且可能导致崩溃,但如果您不耐烦,这是另一种方法。
- (void)didReceiveMemoryWarning {
//do nothing
//[super didReceiveMemoryWarning];
}