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

标签 ios presentmodalviewcontroller

我正在尝试将 View Controller 推送到已经推送的 View Controller 上,如下所示。然而,不知何故,当我尝试推送 newPersonViewController 时,这个新 Controller 并没有被推送到堆栈上。我不知道为什么 Xcode 提示我试图添加一个不属于层次结构的新 Controller 。我是否错误地呈现了 ABPeoplePickerViewController?这就是 newPersonViewController 无法被压入堆栈的原因吗?

来自控制台的消息:

Warning: Attempt to present on whose view is not in the window hierarchy!

代码:

- (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 试图从不是当前 Controller 的 View Controller 中以模态方式呈现。 self(您的原始 View Controller )不是事件 Controller 。 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];
}

关于iOS 如何在已经堆叠的 ViewController 上调用 presentViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261455/

相关文章:

ios - 键盘上方的单词建议有多高?

ios - navigationController.navigationItem 与 navigationItem

swift - 从 appDelegate 快速呈现模态视图

ios - 关闭模态视图 Controller 后后退按钮的动画中断

iphone - NSURLConnection - 在使用另一个类作为委托(delegate)时以及存在身份验证挑战时获取响应数据

ios - 在 applicationDidEnterBackground 上使用 AFNetworking 2.0 发送 GET 请求

iphone - 排行榜不给出分数

ios - 仅关闭呈现的 View Controller 而不是整个导航堆栈 Swift

ipad - 为什么 [UIViewController presentModalViewController :animated:] transitioning the modal view in from the left?

ios - presentModalViewController 导致神秘的僵尸