在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并关闭ABPeoplePickerNavigationController
和ChoosePersonPhoneViewController
。
两个问题:
ChoosePersonPhoneViewController
内关闭两个视图控制器? MyViewController
ChoosePersonPhoneViewController
我的猜测是:
ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)self.navigationController;
MyViewController *nsvc = (MyViewController *)peoplePicker.presentingViewController;
我使用parentViewController
和presentingViewController
以及popViewController
/ dismissViewController
尝试了很多组合,但无法弄明白 - 我不断得到表明我缺乏的例外情况了解视图控制器层次结构。我会很感激一些指针或至少RTFM链接。
答案 0 :(得分:1)
处理其他视图中的更改,操作或用户交互是delegates的基本用例。最佳做法是让第一个视图控制器成为NewSettingsViewController
的委托,然后当用户选择其中一个电话号码时,它会调用其委托上的某些方法来通知它最终的选择。通常,委托可以确定它是否对其获得的结果感到满意,然后可以解除不再需要的任何控制器。
在视图之间保持值/状态同步的其他选项是:
NSNotification
通过NSNotificationCenter
发送 - 最适合用于操作答案 1 :(得分:1)
一旦你的第二个问题得到解答,你的第一个问题就变得容易了。在ChoosePersonPhoneViewController中,具有与myViewController相同的类名为parent的属性,当您从myViewController分配ChoosePersonPhoneViewController时,将其设置为self,就像您将委托设置为self一样。设置父级后,可以从子对象中调用父级中的方法。
答案 2 :(得分:1)
您应该尝试使用ChoosePersonPhoneViewController
访问presentingViewController
哪位苹果文档声明:
此属性使视图控制器显示最近的 祖先
所以你可以尝试一些[ChoosePersonPhoneViewController.presentingViewController dismissModalViewControllerAnimated:YES]
(注意这个方法在iOS 6中已被弃用)。