CNContactViewController无法调用或发送消息(使用Peek和Pop或UIViewControllerPreviewingDelegate显示)

时间:2017-05-15 19:22:42

标签: ios swift cocoa-touch

我在我的应用程序中使用Peek和Pop显示CNContactViewController,它看起来没问题,但没有任何操作正在运行。

这是我的代码。创建视图控制器:

func previewViewController() -> CNContactViewController {
    let contactVC = CNContactViewController(for: theContact)
    contactVC.allowsEditing = false
    contactVC.allowsActions = true
    contactVC.delegate = defaultContactVCDelegate
    return contactVC
}

实施UIViewControllerPreviewingDelegate

extension MyViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(_ previewingContext: UIViewControllerPreviewing,
                     viewControllerForLocation location: CGPoint) -> UIViewController? {
        let preview = previewViewController()
        let wrapper = UINavigationController(rootViewController: preview)
        return wrapper
    }

    func previewingContext(_ previewingContext: UIViewControllerPreviewing,
                     commit viewControllerToCommit: UIViewController) 
    {
        guard let wrapper = viewControllerToCommit as? UINavigationController else { return }
        guard let preview = wrapper.viewControllers.first else { return }
        navigationController?.pushViewController(preview, animated: false)
    }
}

CNContactViewControllerDelegate

class DefaultContactViewControllerDelegate: NSObject, CNContactViewControllerDelegate {
    func contactViewController(_ viewController: CNContactViewController,
                         shouldPerformDefaultActionFor property: CNContactProperty) -> Bool {
        return true
    }
}

我想如果这些动作出现在屏幕上(我的意思是底部动作和顶部圆圈),它们应该是可触摸的。但是当我触摸它们时,没有任何反应,就好像用户交互被禁用一样。

1 个答案:

答案 0 :(得分:0)

嗯,正如经常发生的那样,在我收到答案之前,解决方案就出现了。

问题是在CNContactViewController方法预览后previewingContext(,viewControllerForLocation)以某种方式被破坏了。

因此,我只为相同的CNContact创建并显示新的控制器,而不是使用viewControllerToCommit

这是我的工作代码:

func previewingContext(_ previewingContext: UIViewControllerPreviewing,
                 commit viewControllerToCommit: UIViewController) 
{
    let preview = previewViewController()
    navigationController?.pushViewController(preview, animated: false)
}