问题描述
我尝试使用CNContactPickerViewController
协议在SwiftUI应用程序中显示一个UIViewControllerRepresentable
。正如我已经读过的那样,似乎有一个已知的问题无法解决,但使用here描述的解决方法,我可以正常工作。
但是,无论何时CNContactPickerViewController
出现或消失,我的输出日志中都会出现以下错误:
[PPT]创建与PPT通信所需的CFMessagePort时出错。
我试图找到对此的解释,但互联网上似乎没有任何答案。有人知道此错误来自何处以及PPT
是什么?这个错误与CNContactPickerViewController
与SwiftUI无法正常工作有关吗?
我第一次在iOS 14 beta和Xcode 12 beta中注意到该错误,并且在带有Xcode 12.2的iOS 14.2中仍然存在。
我不知道该错误是否也出现在iOS 13上。
我已经发布了有关此问题的反馈报告。
解决方法
我使用托管 UINavigationController
编写了一个解决方法,这是我的代码:
import SwiftUI
import ContactsUI
struct ContactPickerView: UIViewControllerRepresentable {
@Environment(\.presentationMode) var presentationMode
func makeUIViewController(context: Context) -> UINavigationController {
let navController = UINavigationController()
let controller = CNContactPickerViewController()
controller.delegate = context.coordinator
navController.present(controller,animated: false,completion: nil)
return navController
}
func updateUIViewController(_ uiViewController: UINavigationController,context: Context) {
print("Updating the contacts controller!")
}
// MARK: ViewController Representable delegate methods
func makeCoordinator() -> ContactsCoordinator {
return ContactsCoordinator(self)
}
class ContactsCoordinator : NSObject,UINavigationControllerDelegate,CNContactPickerDelegate {
let parent: ContactPickerView
public init(_ parent: ContactPickerView) {
self.parent = parent
}
func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
print("Contact picked cancelled!")
parent.presentationMode.wrappedValue.dismiss()
}
func contactPicker(_ picker: CNContactPickerViewController,didSelect contact: CNContact) {
print("Selected a contact")
parent.presentationMode.wrappedValue.dismiss()
}
}
}
我使用它:
Button("Select a contact") {
openSelectContact.toggle()
}
.sheet(isPresented: $openSelectContact,onDismiss: nil) {
ContactPickerView()
}