2

我正在尝试将视图控制器推送到已推送的视图控制器上,如下所示。但是,不知何故,当我尝试推送时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)];
}
4

1 回答 1

1

问题是addPerson试图从不是当前控制器的视图控制器中呈现模态。(您的self原始视图控制器)不是活动控制器。是ABPeoplePickerNavigationController

因此,首先,定义一个类属性来跟踪picker

@property (nonatomic, weak) ABPeoplePickerNavigationController *picker;

接着,

  • 修改showPeoplePicker以设置该属性;和
  • 修改addPerson以使用该属性:

因此:

- (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];
}
于 2013-01-10T17:07:52.157 回答