关于如何解决我遇到的这个问题有什么建议,或者更好的实现设计吗?
要求
- 需要一种方法让应用程序在启动时将用户带到上一个详细信息页面(如果这是他们在上次 session 中退出应用程序之前所在的页面)
- 如果它们位于应用的主屏幕上,那么在重新启动时它们可以停留在此处
- 假设我正在使用 UINavigationController,并且主屏幕和详细信息屏幕构建在 UITableViewController 上
我的实现理念
- 检查“viewdidLoad”以查看它们是否在详细屏幕上,如果是则跳转到此(请参阅下面的代码)
问题
- 正常情况下工作正常,但是当我触发内存警告时,事情就会出错,导航栏会出现奇怪的行为。例如,当我看起来像是在详细信息页面内容(UITableView)上时,我看到了主页导航按钮
我的分析
从我在详细信息页面(appointmentsListController)上看到的情况来看,我看到模拟器中出现内存警告:
(a)主页“viewDidLoad”实际上被调用,这是我的概念没有预料到的,所以虽然我从详细 View (UINavigationController)点击“后退”按钮转到主视图(RootViewController),但事实上我的代码已运行,它尝试将用户再次返回到详细信息页面
(b) 我在日志中注意到,在这一点之后,[AppointmentListController viewDidLoad] 似乎在调用之前的 AppointmentListController dealloc 方法之前被调用(即就像我在 Controller A 中一样,返回到 Controller B,但被抛出了到 A - 第一部分的初始释放直到很晚才开始......)
- 所以我想很明显我的想法不太好
问题
关于如何更好地实现我的要求有什么建议吗? (如何检查,放入哪个方法)
代码
- (void)viewDidLoad {
[super viewDidLoad];
// My Implementation of the Requirements which seems flawed in the case there is memory warning triggered
if ( previousSelectedScreen >= 0 ) {
// Setup New Controller
AppointmentListController *appointmentListController = [[AppointmentListController alloc] initWithNibName:@"AppointmentListController" bundle:nil];
appointmentListController.screenToShow = previousSelectedScreen;
// Push new view onto stack
[[self navigationController] pushViewController:appointmentListController animated:NO];
[appointmentListController release];
}
}
最佳答案
这是我的建议:不要将此逻辑放在 View Controller 中,而是放在应用程序委托(delegate)中。通过在显示导航堆栈之前构建导航堆栈,您将有望避免导航栏等可能发生的一些奇怪的事情。要消除内存警告,您可能需要查看应用程序如何分配内存:它可能不一定是与此相关。
无论如何 - 在您的应用程序委托(delegate)中,您可以执行检查以查看用户退出时是否位于详细信息页面上。如果是,您可以创建一个包含导航堆栈的数组(即主屏幕 -> 详细信息页面)。然后,您可以使用其 setViewControllers
方法将其传递到导航 Controller 中。完成此操作后,您可以显示窗口并完成启动应用程序。
关于iphone - 如果用户之前访问过此页面,如何实现自动跳转到详细页面(或修复我的代码以执行此操作,该代码存在设计缺陷),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6242265/