在编辑或选择属性时,不会调用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()
}
}
答案 0 :(得分:3)
有三个用于创建CNContactViewController的初始化程序:
init(for:)
init(forNewContact:)
init(forUnknownContact:)
第一种和第三种形式调用委托方法contactViewController(_:shouldPerformDefaultActionFor:)
。第二种形式没有。那就是您正在使用的那个。
使用第二种方式,您得到的唯一事件是contactViewController(_:didCompleteWith:)
,并且此时新联系人已经保存到数据库中。
在编辑新联系人时,应该调用contactViewController(_ viewController:CNContactViewController,shouldPerformDefaultActionFor属性:CNContactProperty)函数
不,不是。那只是你的想法。
预期的行为:每次您编辑/选择属性时都会打印“ yo”。
然后别再期望了。
当用户编辑/选择联系人属性时,如何获得通知?
你没有。
使用Cocoa之类的框架时,您无法满足自己的期望。您的期望需要基于框架的实际功能。您可能会希望,CNContactViewController及其委托消息按您的描述工作,并且可能向Apple提出了很好的增强要求。但这实际上不是 的工作原理,因此,期望它这样做不会对您有任何好处。