Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI-CNContactViewController导航栏问题_Swiftui_Cncontactviewcontroller - Fatal编程技术网

SwiftUI-CNContactViewController导航栏问题

SwiftUI-CNContactViewController导航栏问题,swiftui,cncontactviewcontroller,Swiftui,Cncontactviewcontroller,我正在尝试实现CNContactViewDelegate,以便能够显示CNContact的详细信息。显然,我是第一个用SwiftUI实现它并遇到问题的人。无论如何,我可以通过使用UIViewControllerRepresentable查看CNContact的详细信息,但我对导航栏有一个问题,在联系人的图像和状态栏之间存在差距-因为导航栏和导航链接,我认为-在原生联系人应用程序中没有这种差距,显然在实现UIKit框架的应用程序中也没有这种差距 这是代码 struct ContactsListVi

我正在尝试实现
CNContactViewDelegate
,以便能够显示
CNContact
的详细信息。显然,我是第一个用
SwiftUI
实现它并遇到问题的人。无论如何,我可以通过使用
UIViewControllerRepresentable
查看
CNContact
的详细信息,但我对
导航栏有一个问题,在
联系人
的图像和
状态栏
之间存在差距-因为
导航栏
导航链接
,我认为-在原生
联系人
应用程序中没有这种差距,显然在实现
UIKit
框架的应用程序中也没有这种差距

这是代码

struct ContactsListView: View {
    @ObservedObject var contactsModel: ContactsViewModel
    var body: some View {
        NavigationView{
            List {
                //After some ForEach's and Section's
                //This view is working. 
                NavigationLink(destination: ContactDetailView(contact: self.$contactsModel.contacts[sectionIdx].contacts[contactIdx])) {
                    Text(self.contactsModel.contacts[sectionIdx].contacts[contactIdx].givenName)
                }
            }
            .navigationBarTitle("Contacts")
        }
    }
}


struct ContactView: UIViewControllerRepresentable {

    @Binding var contact: CNContact

    func makeCoordinator() -> ContactView.Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<ContactView>) -> CNContactViewController {
        let controller = CNContactViewController(for: contact)
        self.navigationBarHidden(true)
        return controller
    }

    func updateUIViewController(_ uiViewController: CNContactViewController, context: UIViewControllerRepresentableContext<ContactView>) {
        print(context)
    }

    class Coordinator: NSObject, CNContactViewControllerDelegate {

        var parent: ContactView

        init(_ contactDetail: ContactView) {
            self.parent = contactDetail
            self.parent.navigationBarHidden(true)

        }
    }
}
struct contacts列表视图:视图{
@观察对象var触点模型:触点VIEWMODEL
var body:一些观点{
导航视图{
名单{
//在一些ForEach和Section之后
//这一观点正在发挥作用。
导航链接(目标:ContactDetailView(联系人:self.$contactsModel.contacts[sectionIdx].contacts[contactIdx])){
文本(self.contactsModel.contacts[sectionIdx].contacts[contactIdx].givenName)
}
}
.navigationBarTitle(“联系人”)
}
}
}
结构ContactView:UIViewControllerRepresentable{
@绑定变量联系人:CNContact
func makeCoordinator()->ContactView.Coordinator{
协调员(自我)
}
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->CNContactViewController{
let controller=CNContactViewController(for:contact)
self.navigationBarHidden(true)
返回控制器
}
func updateUIViewController(uViewController:CNContactViewController,上下文:UIViewControllerRepresentableContext){
打印(上下文)
}
类协调器:NSObject、CNContactViewControllerDelegate{
var父级:ContactView
初始化(uContactDetail:ContactView){
self.parent=contactDetail
self.parent.navigationBarHidden(true)
}
}
}
联系人视图中
,这两个
self.navigationBarHidden(true)
都不工作。本机应用程序的屏幕截图就是问题的一个例子

这是我代码的结果


由于这个问题获得了表决权,我想我可以分享一下我的折衷方案。这解决了差距,但在过渡到细节的过程中,导航栏的背景色出现了问题。过渡之后,情况变得明朗起来

struct ContactDetailView:  View {

    var contact: CNContact

    var body: some View {
        ZStack {
            Color.clear
            ContactView(contact: self.contact)
                .navigationBarTitle("", displayMode: .inline)
        }.edgesIgnoringSafeArea(.top)
    }
}

struct ContactView: UIViewControllerRepresentable {

    var contact: CNContact

    func makeCoordinator() -> ContactView.Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<ContactView>) -> CNContactViewController {
        let controller = CNContactViewController(forUnknownContact: contact)
        controller.allowsActions = true
        controller.allowsEditing = false
        controller.delegate = context.coordinator
        return controller
    }

    func updateUIViewController(_ uiViewController: CNContactViewController, context: UIViewControllerRepresentableContext<ContactView>) {
        print("updated")
    }

    class Coordinator: NSObject, CNContactViewControllerDelegate {

        var parent: ContactView

        init(_ contactDetail: ContactView) {
            self.parent = contactDetail
        }

        func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
        }

        func contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty) -> Bool {

            return true
        }
    }
}
struct ContactDetailView:View{
var触点:CNContact
var body:一些观点{
ZStack{
颜色。清晰
ContactView(联系人:self.contact)
.navigationBarTitle(“,显示模式:。内联)
}.edgesIgnoringSafeArea(.top)
}
}
结构ContactView:UIViewControllerRepresentable{
var触点:CNContact
func makeCoordinator()->ContactView.Coordinator{
协调员(自我)
}
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->CNContactViewController{
让控制器=CNContactViewController(对于未知联系人:contact)
controller.allowsActions=true
controller.allowsEditing=false
controller.delegate=context.coordinator
返回控制器
}
func updateUIViewController(uViewController:CNContactViewController,上下文:UIViewControllerRepresentableContext){
打印(“更新”)
}
类协调器:NSObject、CNContactViewControllerDelegate{
var父级:ContactView
初始化(uContactDetail:ContactView){
self.parent=contactDetail
}
func contactViewController(viewController:CNContactViewController,didCompleteWith contact:CNContact?){
}
func contactViewController(viewController:CNContactViewController,shouldPerformDefaultActionFor属性:CNContactProperty)->Bool{
返回真值
}
}
}

发表了我对解决方案的评论,然后我想到将联系人视图控制器包装在我的自定义NavigationController中。瞧,它修好了

struct ContactView:UIViewControllerRepresentable{
var触点:CNContact
func makeCoordinator()->ContactView.Coordinator{
协调员(自我)
}
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->NavigationController{
让控制器=CNContactViewController(对于未知联系人:contact)
controller.contactStore=CNContactStore()
controller.delegate=context.coordinator
让navigationController=navigationController(rootViewController:controller)
返回导航控制器
}
func updateUIViewController(uViewController:NavigationController,上下文:UIViewControllerRepresentableContext){
}
类协调器:NSObject、CNContactViewControllerDelegate{
var父级:ContactView
初始化(uContactDetail:ContactView){
self.parent=contactDetail
}
func contactViewController(viewController:CNContactViewController,
是否已完成与联系人的联系:CNContact?){
}
func contactViewController(viewController:CNContactViewController,
属性:CNContactProperty)->Bool{
返回真值
}
}
}

是的,日志显示[CNUI WARN]已添加到非导航控制器中,我们将自动更新父导航项。我想只有苹果能解决这个问题。但现在很好,谢谢!