UIViewController知道它是否被推或弹出?

时间:2011-12-20 12:09:10

标签: objective-c ios uitableview uinavigationcontroller

我有一个主要的UITableView,当按下它时它转到另一个UITableView,当按下一个单元格时,它会进入该单元格的DetailView。

我希望中间UITableView的行为不同,具体取决于是否弹出了detailView或UITableView本身是否被推送。如果视图从主表推进,我想滚动到顶部,如果在DetailView弹出后显示,我希望它保持在同一位置。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

在将它推送到navigationController后,可以在DetailViewController上调用scrollToTop方法。

类似的东西:

if (!detailViewController) {
    detailViewController = [[DetailViewController alloc] initWithNibName:nil bundle:nil];
}
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController scrollToTop];
// or use the tableView directly: 
// [detailViewController.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

答案 1 :(得分:1)

在中间视图控制器中,直接从UINavigationController堆栈检查哪个视图是下一个显示的:

- (void)viewWillDisappear:(BOOL)animated
{
    if ([self.navigationController.topViewController isEqual:(UITableViewController *)tvcDetailView]) {
        // Detail view has been pushed onto the UINavigationController stack
    }
    else {
        // Middle view has been popped from the UINavigationController stack
    }
}

答案 2 :(得分:0)

在你的中间UIViewController属性上创建一个名为@property或类似东西的BOOL wasPushed,当你从UIViewController 1初始化它时,在新实例上设置属性,将其推送到导航堆栈,然后,您可以在中视图控制器的loadViewviewDidLoadviewWill/DidAppear方法中使用您的属性。

一旦你使用它,将它设置回FALSE或NO(或其他),当你最终回到它时,由于弹出你的第三个视图控制器,你将把它设为FALSE / NO您的loadViewviewDidLoad等方法。