3

我有一个基于导航的应用程序,其中我将 ABPeoplePickerNavigationController 作为子视图添加到我的导航控制器中,如下所示:我在将子视图添加到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,现在我不能把它带回来?

4

1 回答 1

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 中,并且嵌套在您的根目录中?我认为它不起作用,因为您实际拥有的是第一行的两个之一,而您想要的是第二行。因为我实际上不知道你有哪个没有看到它,我不能告诉你具体要改变什么,但如果你希望它像第二行的层次结构一样一直嵌套,你需要推送你的组视图到根视图控制器(这是您的导航控制器)上,然后您想再次将人员选择器推送到根视图控制器上。在此之后,您的后退按钮和视图切换应该按照您希望的方式工作。

于 2011-08-19T21:32:42.977 回答