私はこの問題にかなりの数日間取り組んできましたが、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)
}
}
ご指摘ありがとうございます。ラバーダッキングは残念ながら役に立ちませんでした...