iOS如何在已堆叠的ViewController上调用presentViewController

iOS如何在已堆叠的ViewController上调用presentViewController,ios,presentmodalviewcontroller,Ios,Presentmodalviewcontroller,我正在尝试将视图控制器推到已经推过的视图控制器上,如下所示。然而,不知何故,当我试图推送newPersonViewController时,这个新控制器没有被推送到堆栈上。我不知道为什么Xcode抱怨我试图添加一个不属于层次结构的新控制器。我是否错误地显示了ABPeoplePickerViewController?这就是为什么不能将newPersonViewController推送到堆栈上的原因吗 来自控制台的消息: 警告:尝试显示其视图不在窗口层次结构中的对象 守则: - (void)addPe

我正在尝试将视图控制器推到已经推过的视图控制器上,如下所示。然而,不知何故,当我试图推送
newPersonViewController
时,这个新控制器没有被推送到堆栈上。我不知道为什么Xcode抱怨我试图添加一个不属于层次结构的新控制器。我是否错误地显示了
ABPeoplePickerViewController
?这就是为什么不能将
newPersonViewController
推送到堆栈上的原因吗

来自控制台的消息:

警告:尝试显示其视图不在窗口层次结构中的对象

守则:

- (void)addPerson
{
    ABNewPersonViewController *newPersonVC = [[ABNewPersonViewController alloc] init];
    newPersonVC.newPersonViewDelegate = self;
    UINavigationController *uiNav = [[UINavigationController alloc] initWithRootViewController:newPersonVC];

    [self presentViewController:uiNav animated:YES completion:nil];
}

- (void)showPeoplePicker
{
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;

    [self presentViewController:picker animated:YES completion:nil];
    [picker.topViewController setEditing:YES];
    picker.topViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
    picker.topViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(peoplePickerCancel)];
}

问题是,
addPerson
试图从视图控制器(而不是当前控制器)以模态方式呈现。
self
(原始视图控制器)不是活动控制器。
ABPeoplePickerNavigationController

因此,首先,定义一个类属性来跟踪
选择器

@property (nonatomic, weak) ABPeoplePickerNavigationController *picker;
然后呢,

  • 修改
    showPeoplePicker
    以设置该属性;及
  • 修改
    addPerson
    以使用该属性:
因此:


问题的根源在于
addPerson
中存在
[self-presentViewController:…]
,因为
self
不是当前的视图控制器。只需将其更改为新属性,您就完成了!抱歉用编辑折磨你!嗨,罗布,非常感谢你!它正在工作。我也在考虑选择错误的活动视图控制器,但不知道如何修复它。之前我尝试过:
[self.presentingViewController presentViewController:uiNav动画:是完成:nil]
[self.presentingViewController.navigationViewController presentViewController:uiNav动画:是完成:无]也是,但它不起作用。因此,我认为调用self.presentingViewController将为我提供当前显示的视图控制器。
- (void)addPerson
{
    ABNewPersonViewController *newPersonVC = [[ABNewPersonViewController alloc] init];
    newPersonVC.newPersonViewDelegate = self;
    UINavigationController *uiNav = [[UINavigationController alloc] initWithRootViewController:newPersonVC];

    [self.picker presentViewController:uiNav animated:YES completion:nil];
}

- (void)showPeoplePicker
{
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;

    [self presentViewController:picker animated:YES completion:nil];
    [picker.topViewController setEditing:YES];
    picker.topViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd    target:self action:@selector(addPerson)];
    picker.topViewController.navigationItem.leftBarButtonItem  = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(peoplePickerCancel)];

    self.picker = picker;
}

- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person
{
    [newPersonView dismissViewControllerAnimated:YES completion:nil];
}