推送 ABNewPersonViewController 时出现问题

Issue while pushing ABNewPersonViewController

我正在使用 AddressBookUI Framework 添加联系人,当我尝试按下此视图控制器然后取消并完成按钮无法正常工作时,我不想显示它

这是我的代码

ABNewPersonViewController *abnpvc = [[ABNewPersonViewController alloc] init];
[abnpvc setNewPersonViewDelegate: self];
[self.navigationController pushViewController:abnpvc animated:YES];

我也尝试添加为子视图而不是推送它,但是当我添加为子视图时却没有添加

根据 评论 我试过

UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:abnpvc];
[self presentViewController:navigation animated:YES completion:nil];

谁能帮我解决为什么不能正常工作?

为什么你不能照the docs说的去做?

It is recommended that you present a new-person view controller modally.

使用

ABNewPersonViewController *abnpvc = [[ABNewPersonViewController alloc] init];
[abnpvc setNewPersonViewDelegate: self];
[self presentViewController:abnpvc animated:YES completion:nil];

那应该没问题。

编辑

转念一想,您是否正确设置了委托并调用了实现?我怀疑它们没有实现或委托设置不正确。

Apple 指南(重要):: 新人视图控制器必须与导航控制器一起使用才能正常运行。建议您模态呈现新人视图控制器。

添加代表

@interface ViewController () <ABNewPersonViewControllerDelegate>

推viewController

ABNewPersonViewController *abnpvc = [[ABNewPersonViewController alloc] init];
[abnpvc setNewPersonViewDelegate: self];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:abnpvc];
[self presentModalViewController:navController animated:YES];

现在添加委托方法

#pragma mark ABNewPersonViewControllerDelegate methods

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

那会很好。

考虑到 iOS 9 中对 ABNewPersonViewController 的其他答案和弃用,您也可以实现它。

根据您的评论:

cancel and done button not working properly

如果您像这样在界面上包含 ABNewPersonViewControllerDelegate,它们就会正常工作:

@interface ViewController () <ABNewPersonViewControllerDelegate>

像这样在导航堆栈上推送 viewController:

ABNewPersonViewController *controller = [[ABNewPersonViewController alloc] init];
controller.newPersonViewDelegate = self;
[self.navigationController pushViewController:controller animated:YES];

并通过实施此方法来遵守协议:

- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(nullable ABRecordRef)person {
    // Trick to go back to your view by popping it from the navigation stack when done or cancel button is pressed
    [self.navigationController popViewControllerAnimated:YES];
}

棘手的行是在按下 DoneCancel 按钮时从导航堆栈中弹出 newPersonController。

尽情享受