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

在iOS上选择/编辑联系人属性时未调用CNContactViewControllerDelegate,ios,swift,contacts,cncontact,Ios,Swift,Contacts,Cncontact,编辑或选择属性时,不会调用CNContactviewController的委托 编辑新联系人时,应该调用contactViewController(viewController:CNContactViewController,shouldPerformDefaultActionFor property:CNContactProperty)函数,但实际上不是 当用户编辑/选择联系人属性时,如何获得通知 复制步骤: 复制下面的视图控制器 编辑/选择联系人 财产 预期行为: 每次编辑/选择属性时都会打

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

编辑新联系人时,应该调用
contactViewController(viewController:CNContactViewController,shouldPerformDefaultActionFor property:CNContactProperty
)函数,但实际上不是

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

复制步骤:

  • 复制下面的视图控制器
  • 编辑/选择联系人 财产
  • 预期行为:

    每次编辑/选择属性时都会打印“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()
        }
    }
    

    制作CNContactViewController有三个初始值设定项:

    • 现有联系人:
      init(for:)
    • 新联系人:
      init(forNewContact:)
    • 未知联系人:
      init(用于未知联系人:)
    第一个和第三个表单调用委托方法
    contactViewController(uu1;:shouldPerformDefaultActionFor:)
    。第二种形式没有。这就是你正在使用的

    对于第二种风格,您得到的唯一事件是
    contactViewController(u:didCompleteWith:)
    ,此时新联系人已经保存到数据库中

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

    不,不是。那只是你想出的主意

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

    那就别指望了

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

    你没有


    当您使用像Cocoa这样的框架时,您无法满足任何期望。您的期望需要基于框架的实际功能。您可能希望CNContactViewController及其代理消息能够像您描述的那样工作,这可能会对Apple提出一个非常好的增强请求。但事实上,这不是它的工作方式,因此期望它这样做对您没有任何好处。

    制作CNContactViewController有三个初始值设定项:

    • 现有联系人:
      init(for:)
    • 新联系人:
      init(forNewContact:)
    • 未知联系人:
      init(用于未知联系人:)
    第一个和第三个表单调用委托方法
    contactViewController(uu1;:shouldPerformDefaultActionFor:)
    。第二种形式没有。这就是你正在使用的

    对于第二种风格,您得到的唯一事件是
    contactViewController(u:didCompleteWith:)
    ,此时新联系人已经保存到数据库中

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

    不,不是。那只是你想出的主意

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

    那就别指望了

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

    你没有


    当您使用像Cocoa这样的框架时,您无法满足任何期望。您的期望需要基于框架的实际功能。您可能希望CNContactViewController及其代理消息能够像您描述的那样工作,这可能会对Apple提出一个非常好的增强请求。但事实上,这不是它的工作方式,因此期待它这样做对您没有任何好处。

    好的,谢谢。文档
    contactViewController(u:shouldPerformDefaultActionFor:)
    非常稀少。那么这个函数做什么呢?是否无法知道用户是否更改了联系人属性?再次感谢!整个问题对我来说没什么意义。使用
    init(forNewContact:)
    您要求用户创建一个新联系人。知道用户何时完成了一半任务是没有意义的。用户是否创建了新联系人,您将在联系人创建完毕后了解所有信息。知道用户在中间做什么有什么用?不过,正如我所说,如果您有一个好的用例,请将其提交给苹果。更让我不安的是,当您收到任何事件时,联系人已经保存到数据库中,您无法阻止。感谢您的回复。目标是重用联系人表单,因为它具有地址和电话号码的本地化逻辑,然后将联系人信息存储在其他位置。这并不是为了在用户的通讯录中存储联系人,而是为了在应用程序中存储联系人。是的,这就是我刚才提到的问题:没有为您提供任何这样做的界面。你能做的最好的事情就是在用户存储联系人后立即将其从数据库中删除(我就是这样做的)。好的,谢谢!顺便问一下,您是否知道在编辑过程中是否可以只显示字段的子集(例如,地址、电话)?好的,谢谢。文档
    contactViewController(u:shouldPerformDefaultActionFor:)
    非常稀少。那么这个函数做什么呢?是否无法知道用户是否更改了联系人属性?再次感谢!整个问题对我来说没什么意义。使用
    init(forNewContact:)
    您要求用户创建一个新联系人。知道用户何时完成了一半任务是没有意义的。用户是否创建了新联系人,您将在联系人创建完毕后了解所有信息。知道用户在中间做什么有什么用?不过,正如我所说,如果您有一个好的用例,请将其提交给苹果。更让我不安的是,当您收到任何事件时,联系人已经保存到数据库中,您可以