任何帮助表示赞赏!这几天我没有结果。
情景:
我和iPad应用程序有一个SplitViewController,显示2个controllersViews(左边是Root,右边是Detail)
Root允许递归导航(可能是几个向下钻取级别的树),并且每次在控制器堆栈中始终推送相同的控制器类(UITableView)时,我都会调用它。当用户点击一个单元格(左侧)时,详细视图(右侧)显示该信息。 请记住,详细视图控制器并不总是相同的类:它意味着我根据我必须显示的信息类型以编程方式分配(并释放)几个detailView控制器。
这里是片段:
UIViewController <ItemGenericViewController> *newDetailViewController = [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil];
//the detailViewController has been defined in the head section as ItemGenericViewController
//each detailViewController is a subclass of ItemGenericViewController
detailViewController = newDetailViewController;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController];
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil];
self.splitViewController.viewControllers = viewControllers;
[nav release];
[viewControllers release];
[detailViewController release];
一切正常,直到出现记忆警告。
从那一刻起,如果我尝试显示一个新的detailViewcontroller,在SplitConController中,RootController和detailController之间的“连接”似乎消失了。结果是:splitController的右侧没有任何内容。 同时,如果我在根控制器中导航到父级别,情况仍然失败。
每次我在堆栈中推送一个新的RootController实例(左列)我都会释放相同的控制器(为了节省内存)我怀疑,在收到内存警告后,iOS正试图释放本身的记忆和我的“历史”也通过分裂控制器消失了相关的连接。
是一场噩梦; - )
你有什么建议吗?
谢谢
的Dario
答案 0 :(得分:1)
我遇到了类似的问题(可能更糟 - 可能的视图切换的16种组合)......但我相信我现在已经解决了。
所以,我相信你已经使用了Apple的视图切换示例(我有修改),如果你有这样的话,问题是“root”splitViewController(来自MainWindow.xib)获得“niled”作为默认行为记忆警告。即使您向其添加新的视图控制器阵列,也不会导致任何更改(更糟糕的是,它不会显示任何警告信号)。解决方案是检查它是否为零,如果是,则重新初始化它。
这里是代码,使用上面的例子:
UIViewController <ItemGenericViewController> *newDetailViewController = [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil];
//the detailViewController has been defined in the head section as ItemGenericViewController
//each detailViewController is a subclass of ItemGenericViewController
detailViewController = newDetailViewController;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController];
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil];
/**** Milos Edit ****/
if (self.splitViewController == nil) {
// I'm keeping reference in app delegate, but any way to reinitialize splitViewController is OK
self.splitViewController = delegate.splitViewController;
}
/**** end of edit ****/
self.splitViewController.viewControllers = viewControllers;
[nav release];
[viewControllers release];
[detailViewController release];
希望它会有所帮助。
干杯
米洛斯