在 iOS 上联系 属性 selected/edited 时未调用 CNContactViewControllerDelegate
CNContactViewControllerDelegate not called when contact property selected/edited on iOS
编辑或选择属性时,不会调用 CNContactviewController
的委托。
编辑新联系人时,应该调用contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty
)函数,但实际上没有。
当用户 edits/selects 联系 属性 时如何收到通知?
重现步骤:
- 复制下面的视图控制器。
- Edit/select一个联系人
属性.
预期行为:
每次 edit/select a 属性. 时都会打印 "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(forUnknownContact:)
第一种和第三种形式调用委托方法contactViewController(_:shouldPerformDefaultActionFor:)
。第二种形式没有。那就是你正在使用的那个。
使用第二种方式,您获得的唯一事件是 contactViewController(_:didCompleteWith:)
,此时新联系人已经保存到数据库中。
When editing a new contact, the contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty) function is supposed to be called
不,不是。那只是你编造的想法。
Expected behavior: "yo" is printed every time you edit/select a property.
那就别期待了。
How do you get notified when the user edits/selects a contact property?
你不知道。
当您使用像 Cocoa 这样的框架时,您无法满足任何您喜欢的期望。您的期望需要基于框架的实际作用。您可能希望 CNContactViewController 及其委托消息像您描述的那样工作,这可能会向 Apple 提出非常好的增强请求。但这并不是它的工作方式事实上,所以期望它这样做对你没有任何好处。
编辑或选择属性时,不会调用 CNContactviewController
的委托。
编辑新联系人时,应该调用contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty
)函数,但实际上没有。
当用户 edits/selects 联系 属性 时如何收到通知?
重现步骤:
- 复制下面的视图控制器。
- Edit/select一个联系人 属性.
预期行为:
每次 edit/select a 属性. 时都会打印"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(forUnknownContact:)
第一种和第三种形式调用委托方法contactViewController(_:shouldPerformDefaultActionFor:)
。第二种形式没有。那就是你正在使用的那个。
使用第二种方式,您获得的唯一事件是 contactViewController(_:didCompleteWith:)
,此时新联系人已经保存到数据库中。
When editing a new contact, the contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty) function is supposed to be called
不,不是。那只是你编造的想法。
Expected behavior: "yo" is printed every time you edit/select a property.
那就别期待了。
How do you get notified when the user edits/selects a contact property?
你不知道。
当您使用像 Cocoa 这样的框架时,您无法满足任何您喜欢的期望。您的期望需要基于框架的实际作用。您可能希望 CNContactViewController 及其委托消息像您描述的那样工作,这可能会向 Apple 提出非常好的增强请求。但这并不是它的工作方式事实上,所以期望它这样做对你没有任何好处。