gpt4 book ai didi

ios - 在 SwiftUI 中使用协调器模式时未调用 CNContactViewControllerDelegate

转载 作者:行者123 更新时间:2023-12-01 16:11:47 24 4
gpt4 key购买 nike

我已经研究这个问题好几天了,似乎 SwiftUI 的相对“新奇”似乎对我没有帮助。
我的直觉是我以某种方式使用 CNContactViewControllerDelegate错了,但苹果的文档以及其他关于 SO 的问题都让它看起来应该可以工作。或许,也是.sheet造成的的处理,但我也无法隔离问题。不包装 NewContactView里面 NavigationView也没有任何区别并删除了默认导航栏(如预期的那样)。
我正在展示 CNContactViewControllerinit(forNewContact:)让应用程序的用户能够添加新联系人。持久化并且一切正常,但是,似乎没有一个委托(delegate)的函数被调用。
使用 iOS 13 中引入的“滑动关闭”手势关闭模式既不会调用委托(delegate)函数,也不会使用 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>) {
}
}
显示 Controller 的 View 代码如下所示:
.sheet(isPresented: self.$viewModel.showNewContact, onDismiss: { self.viewModel.fetchContacts() }) {
NavigationView() {
NewContactView(contact: self.$viewModel.newContact)
}
}
感谢您的任何指点!可悲的是,橡皮鸭没有帮助......

最佳答案

SwiftUI 自己创建协调器并在上下文中提供它来表示,所以只需使用

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

关于ios - 在 SwiftUI 中使用协调器模式时未调用 CNContactViewControllerDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62673089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com