2

私はこの問題にかなりの数日間取り組んできましたが、SwiftUI の相対的な「新しさ」がこれに役立たないようです。

私の直感は、私はどういうわけかCNContactViewControllerDelegate間違った使い方をしているということですが、AppleのドキュメントとSOに関する他の質問の両方が、それがうまくいくように思わせます。.sheetさんの扱いも原因なのかもしれませんが、こちらも切り分けには至りませんでした。NewContactView内部でラップNavigationViewしないことも違いはなく、デフォルトのナビゲーションバーが削除されました(予想どおり)。

アプリのユーザーが新しい連絡先を追加できるようにするための をCNContactViewController示しています。init(forNewContact:)持続し、すべてが正常に機能しますが、デリゲートの関数はどれも呼び出されないようです。

iOS 13 で導入された「スワイプして閉じる」ジェスチャでモーダルを閉じても、デリゲート関数を呼び出すことも、 によって提供されるナビゲーション ボタンを使用することもできませんCNContactViewController

import Foundation
import SwiftUI
import ContactsUI

struct NewContactView: UIViewControllerRepresentable {
    class Coordinator: NSObject, CNContactViewControllerDelegate, UINavigationControllerDelegate {

        func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
            if let c = contact {
                self.parent.contact = c
            }
            viewController.dismiss(animated: true)
        }
        
        func contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty) -> Bool {
            return true
        }

        var parent: NewContactView

        init(_ parent: NewContactView) {
            self.parent = parent
        }
    }

    @Binding var contact: CNContact

    init(contact: Binding<CNContact>) {
        self._contact = contact
    }

    typealias UIViewControllerType = CNContactViewController

    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NewContactView>) -> NewContactView.UIViewControllerType {
        let vc = CNContactViewController(forNewContact: CNContact())
        vc.delegate = makeCoordinator()
        return vc
    }

    func updateUIViewController(_ uiViewController: NewContactView.UIViewControllerType, context: UIViewControllerRepresentableContext<NewContactView>) {
    }
}

コントローラーを表示するためのビューのコードは次のようになります。

.sheet(isPresented: self.$viewModel.showNewContact, onDismiss: { self.viewModel.fetchContacts() }) {
        NavigationView() {
                NewContactView(contact: self.$viewModel.newContact)
        }
}

ご指摘ありがとうございます。ラバーダッキングは残念ながら役に立ちませんでした...

4

1 に答える 1