在iOS上选择/编辑联系人属性时未调用CNContactViewControllerDelegate

时间:2018-12-04 00:52:04

标签: ios swift contacts cncontact

在编辑或选择属性时,不会调用CNContactviewController的委托。

编辑新联系人时,应该调用contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty)函数,但不会。

当用户编辑/选择联系人属性时,如何获得通知?

复制步骤:

  1. 在下面复制视图控制器。
  2. 编辑/选择联系人     财产。

预期的行为:

每次编辑/选择属性时,都会打印

“ yo”。

实际行为:

没事。

import Foundation
import Contacts
import ContactsUI


class ContactViewController: UIViewController, CNContactViewControllerDelegate {


    override func viewDidLoad() {
        super.viewDidLoad()

        createContact()
    }


    func createContact() {
        let contactController = CNContactViewController(forNewContact: nil)

        contactController.delegate = self
        contactController.allowsEditing = true
        contactController.allowsActions = true
        contactController.displayedPropertyKeys = [CNContactPostalAddressesKey, CNContactPhoneNumbersKey, CNContactGivenNameKey]

        contactController.view.layoutIfNeeded()

        present(contactController, animated:true)
    }


    // =============================================================================================================
    // MARK: CNContactViewControllerDelegate Functions
    // =============================================================================================================
    func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
        viewController.dismiss(animated: true, completion: nil)
        print("hi")
    }


    func contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty) -> Bool {
        print("yo")
        return true
    }


    // =============================================================================================================
    // MARK: UIViewController Functions
    // =============================================================================================================
    override var prefersStatusBarHidden: Bool {
        return true
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

1 个答案:

答案 0 :(得分:3)

有三个用于创建CNContactViewController的初始化程序:

  • 现有联系人:init(for:)
  • 新联系人:init(forNewContact:)
  • 未知联系人:init(forUnknownContact:)

第一种和第三种形式调用委托方法contactViewController(_:shouldPerformDefaultActionFor:)。第二种形式没有。那就是您正在使用的那个。

使用第二种方式,您得到的唯一事件是contactViewController(_:didCompleteWith:),并且此时新联系人已经保存到数据库中。

  

在编辑新联系人时,应该调用contactViewController(_ viewController:CNContactViewController,shouldPerformDefaultActionFor属性:CNContactProperty)函数

不,不是。那只是你的想法。

  

预期的行为:每次您编辑/选择属性时都会打印“ yo”。

然后别再期望了。

  

当用户编辑/选择联系人属性时,如何获得通知?

你没有。

使用Cocoa之类的框架时,您无法满足自己的期望。您的期望需要基于框架的实际功能。您可能会希望,CNContactViewController及其委托消息按您的描述工作,并且可能向Apple提出了很好的增强要求。但这实际上不是 的工作原理,因此,期望它这样做不会对您有任何好处。