我尝试使用CNContactPickerViewController协议(protocol)在SwiftUI应用程序中呈现UIViewControllerRepresentable。正如我已经读过的,似乎有一个已知的问题无法解决,但是我使用here描述的解决方法使它正常工作。
但是,每当出现CNContactPickerViewController或将其撤回时,我的输出日志中都会出现以下错误:

我试图找到有关此问题的解释,但互联网上似乎没有任何答案。有人知道此错误来自何处以及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()
     }

关于ios - 创建与PPT通信所需的CFMessagePort时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63441752/

10-17 01:10