如何访问视图控制器的父母并正确解雇self和self.parent?

时间:2013-05-13 20:04:05

标签: iphone ios uiviewcontroller

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并关闭ABPeoplePickerNavigationControllerChoosePersonPhoneViewController

两个问题:

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

我的猜测是:

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

我使用parentViewControllerpresentingViewController以及popViewController / dismissViewController尝试了很多组合,但无法弄明白 - 我不断得到表明我缺乏的例外情况了解视图控制器层次结构。我会很感激一些指针或至少RTFM链接。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您应该尝试使用ChoosePersonPhoneViewController访问presentingViewController哪位苹果文档声明:

  

此属性使视图控制器显示最近的   祖先

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