1

MyViewController中,我要求用户从通讯录中选择一个人:(单击按钮)

peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
peoplePicker.peoplePickerDelegate = self;
[self presentViewController:peoplePicker animated:YES completion:NULL];

如果用户选择一个拥有多个电话号码的人,我将展示一个新的 UITableViewController,它允许用户选择一个电话号码:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    // ...
    next = [[ChoosePersonPhoneViewController alloc] initWithStyle:UITableViewStyleGrouped personPhoneInfoArray:personPhoneInfos];
    [peoplePicker pushViewController:next animated:YES];
    // ...
}

当用户选择一个电话号码时,我想将该电话号码带回原来的 ViewController 并关闭两个ABPeoplePickerNavigationControllerand ChoosePersonPhoneViewController

两个问题:

  • 如何从内部关闭两个视图控制器ChoosePersonPhoneViewController
  • 我如何MyViewController从内部访问ChoosePersonPhoneViewController

我的猜测是:

ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)self.navigationController;
MyViewController *nsvc = (MyViewController *)peoplePicker.presentingViewController;

我尝试了许多使用parentViewControllerandpresentingViewControllerpopViewController/的组合dismissViewController,但无法真正弄清楚 - 我不断收到异常,这表明我对视图控制器层次结构缺乏了解。我将不胜感激一些指针或至少 RTFM 链接。

4

3 回答 3

1

在其他视图中处理更改、操作或用户交互是委托的基本用例。最佳实践是让第一个视图控制器成为 的代理NewSettingsViewController,然后当用户选择其中一个电话号码时,它会调用其代理上的某些方法来通知它最终选择。通常,委托可以确定它是否对它获得的结果感到满意,然后可以关闭任何不再需要的控制器。

保持视图之间的值/状态同步的其他选项是:

于 2013-05-13T20:10:06.037 回答
1

一旦你回答了第二个问题,你的第一个问题就变得容易了。在ChoosePersonPhoneViewController 中,有一个与myViewController 相同类的属性,命名为parent,当你从myViewController 分配ChoosePersonPhoneViewController 时,将其设置为self,就像你将delegate 设置为self。一旦设置了父对象,您就可以从子对象调用父对象中的方法。

于 2013-05-13T20:11:30.477 回答
1

您应该尝试ChoosePersonPhoneViewController访问presentingViewControllerwhich apple doc 指出:

此属性保存呈现最近祖先的视图控制器

所以你可以尝试一下[ChoosePersonPhoneViewController.presentingViewController dismissModalViewControllerAnimated:YES](注意这个方法在 iOS 6 中被弃用了)。

于 2013-05-13T20:11:44.913 回答