将子视图添加到UINavigationController然后返回第一个子视图?

时间:2011-08-19 21:14:47

标签: iphone xcode uinavigationcontroller abpeoplepickerview

我有一个基于导航的应用程序,其中我将ABPeoplePickerNavigationController作为子视图添加到我的Navigation Contorller中,如下所示: 在将子视图添加到navView之前,我已保存视图。

ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
peoplePicker.peoplePickerDelegate = self;

navView = [[UIView alloc] init];
navView = [[self.view superview] superview];

[[[self.view superview] superview] addSubview:[peoplePicker view]];

它工作正常,但是当我完成PeoplePicker并且我想回到之前的视图时。我使用了这段代码,但它不起作用。

[[[self.view superview] superview] addSubview:navView];

我没理解,我已经从子视图中保存了navView,现在我无法将其恢复?

1 个答案:

答案 0 :(得分:1)

您需要添加后退按钮,如下所示:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];   

理想情况下,您的NavigationController是应用程序的根目录,在这种情况下,任何其他视图都是它的子视图,因此您永远不会远离导航控制器,只需更改显示的实际视图。

此外,您尝试引用第一个视图的方式相当混乱/混乱。您应该将其更改为:

[appDelegate.navigationController topViewController];    

[appDelegate.navigationController popToRootViewController];

我无法告诉您确定使用哪个,因为我不确定您的确切视图层次结构,但我强烈建议您尝试优化该代码。

我应该注意导航控制器上的后退按钮和下面的两行做不同的事情。后退按钮返回一个视图,而popToRoot和topView都旨在将您带回到第一个viewController。

修改:将后退按钮代码更改为我实际使用的代码

编辑2:因为我在这里有更多的空间,我可以尝试更好地理解你的层次结构。它看起来像这样?

Root View                     or                 Root View
-> Group View                                    -> Group View
ABPeoplePicker View                              -> ABPeople Picker View

Root View
-> Group View
-> -> ABPeoplePicker

意味着ABPeoplePicker嵌套在Group中,并且嵌套在root中?我认为它不起作用,因为你实际拥有的是第一行中的两个之一,当你想要的是第二行。因为我实际上并不知道你有哪一个没有看到它,我无法告诉你究竟要改变什么,但是如果你想让它一直嵌套在第二行的heirarchy上,你需要推动你的组视图在根视图控制器(这是您的导航控制器)上,然后您想再次将People Picker推送到根视图控制器上。在此之后,您的后退按钮和视图切换应该按照您希望的方式工作。