如果用户之前处于此状态,我如何实现自动跳转到详细页面(或修复我的代码以执行此操作具有设计缺陷)

时间:2011-06-05 10:12:43

标签: iphone ios uinavigationcontroller uitableview didreceivememorywarning

关于如何解决这个问题的建议,或者更好的实现设计?

要求

  • 启动时应用程序需要一种方法将用户带到上一个详细信息页面,如果这是他们在上一次会话中退出应用程序之前的状态
  • 如果他们在应用程序的主屏幕上,那么在重新启动时他们可以留在这里
  • 假设我正在使用UINavigationController,主屏幕和详细信息屏幕构建在UITableViewController上

我的实施理念

  • 勾选“viewdidLoad”以查看它们是否在详细屏幕上,然后如果是这样跳转到此(请参阅下面的代码)

问题

  • 正常工作正常,但是当我触发内存警告事情搞砸了,我得到了导航栏奇怪的行为。例如,我看到主页面导航按钮,当它看起来像我在详细页面内容(UITableView)

我的分析

  • 从我在详细信息页面(约会列表控制器)上看到的内容并在模拟器中导致内存警告时我看到:

    (a)主页“viewDidLoad”实际上被调用,这是我的概念没想到的,所以当我从详细视图(UINavigationController)点击BACK按钮转到主视图(RootViewController)时,事实上,我的代码已经运行,并且它会尝试将用户再次返回到详细信息页面

    (b)我注意到在我的日志之后,在调用前一个AppointmentListController dealloc方法之前似乎调用了[AppointmentListController viewDidLoad](就像我在控制器A中一样,回到控制器B,但被抛回到A - 并且第一部分的初始dealloc直到晚才开始......)

  • 所以我猜很明显我的想法不太好

问题

有关如何更好地实施我的要求的任何建议? (如何检查,将它们放入哪种方法)

代码

- (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]; 
    } 

}

1 个答案:

答案 0 :(得分:2)

以下是我建议的内容:而不是在视图控制器中使用此逻辑,而是在应用程序委托中使用此逻辑。通过在显示之前构建导航堆栈,您可以避免使用导航栏等可能发生的一些奇怪的事情。要消除内存警告,您可能需要查看应用程序如何分配内存:它可能不一定是与此有关。

无论如何 - 在您的应用程序委托中,您可以执行检查以查看用户退出时是否在详细信息页面上。如果是,则可以创建包含导航堆栈的数组(即主屏幕 - >详细信息页面)。然后,您可以使用其setViewControllers方法将其传递到导航控制器中。完成后,您可以显示窗口并完成启动应用程序。