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]已添加到非导航控制器中,我们将自动更新父导航项。我想只有苹果能解决这个问题。但现在很好,谢谢!