Ios SwiftUI-表单中的NavigationLink单元格在详细信息弹出后保持高亮显示

Ios SwiftUI-表单中的NavigationLink单元格在详细信息弹出后保持高亮显示,ios,swift,swiftui,uikit,Ios,Swift,Swiftui,Uikit,在iOS 14中,NavigationLinks在表单上下文中返回后似乎不会被取消选择。 这同样适用于表单选择器s以及导致从列表中显示另一个视图的任何其他内容(为显示单元格提供突出显示的上下文) 我在iOS 13中没有注意到这种行为 一旦另一个视图被取消,是否有办法“取消选择”高亮显示的行 示例代码: struct ContentView:View{ var body:一些观点{ 形式{ 导航链接(目的地:文本(“详细信息”)){ 文本(“链接”) } } } } (不同)示例视觉: 我做了

在iOS 14中,
NavigationLink
s在
表单
上下文中返回后似乎不会被取消选择。 这同样适用于
表单
选择器
s以及导致从列表中显示另一个
视图
的任何其他内容(为显示单元格提供突出显示的上下文)

我在iOS 13中没有注意到这种行为

一旦另一个视图被取消,是否有办法“取消选择”高亮显示的行

示例代码:

struct ContentView:View{
var body:一些观点{
形式{
导航链接(目的地:文本(“详细信息”)){
文本(“链接”)
} 
}
}
}
(不同)示例视觉:


我做了更多的修补,结果发现这是由于
UIHostingController
嵌套在
UINavigationController
中并使用该导航控制器造成的。将导航堆栈更改为使用SwiftUI
NavigationView
解决了此问题

与@pawello2222在问题评论中所说的类似,我认为根本原因与使用外部
UINavigationController
时SwiftUI不理解正确的导航层次结构有关

这只是一个修复了的例子,但我仍然在各种其他环境中遇到这个问题,这取决于我的视图的结构

我已经向苹果公司提交了一份FB8705430问题报告,所以希望这个问题能很快得到解决

之前(断开):

struct ContentView:View{
var body:一些观点{
形式{
导航链接(目标:文本(“测试”)){
文本(“测试”)
}
}
}
}
//(UIKit演示上下文)
let view=ContentView()
让host=UIHostingController(rootView:view)
让nav=UINavigationController(rootViewController:host)
当前(导航,动画:真,完成:无)
之后(工作):

struct ContentView:View{
var body:一些观点{
导航视图{
形式{
导航链接(目标:文本(“测试”)){
文本(“测试”)
}
}
}
}
}
//(UIKit演示上下文)
let view=ContentView()
让host=UIHostingController(rootView:view)
当前(主机,动画:真,完成:无)

在我的例子中,当在我的
导航视图
列表/表单
之间使用任何视图内容(例如Text()、Image()、…)时,就会出现这种行为

var body: some View {
    
    NavigationView {
        VStack {
            Text("This text DOES make problems.")
            List {
                NavigationLink(destination: Text("Doesn't work correct")) {
                    Text("Doesn't work correct")
                }
            }
        }
    }
}
将文本()置于列表下方不会产生任何问题:

var body: some View {
    
    NavigationView {
        VStack {
            List {
                NavigationLink(destination: Text("Does work correct")) {
                    Text("Does work correct")
                }
            }
            Text("This text doesn't make problems.")
        }
    }
}

这绝对是一个XCode 12错误。随着越来越多的人报告这一问题,问题越早得到解决。

也有同样的问题。奇怪的是,完全相同的代码在iOS13中工作。 我有一个简单的问题清单:

struct TestList: View {
    let someArray = ["one", "two", "three", "four", "five"] 
    var body: some View {
        List(someArray, id: \.self) { item in 
                NavigationLink(
                    destination: Text(item)) {
                    Text(item)
                }.buttonStyle(PlainButtonStyle()) 
        }.navigationBarTitle("testlist") 
    }
}
这体现在:

struct ListControllerView: View {
    @State private var listPicker = 0
    var body: some View {
        NavigationView{
            Group{
                VStack{
                    Picker(selection: $listPicker, label: Text("Detailoverview")) {
                        Text("foo").tag(0)
                        Text("bar").tag(1)
                        Text("TestList").tag(2)
                    }

这是在选项卡栏中。

我也遇到过这个问题,它似乎与前面提到的工作表有关


我的解决方案是快速切换
UITableView
catch选项,然后取消选择单元格。这样做的代码。希望在将来的iOS中可以解决这个问题。

我通过向列表的不同组件添加ID,使用绑定并在.onDisappear上重置绑定,成功地解决了这个问题

struct ContentView:View{
@状态变量选择:字符串?=nil
var body:一些观点{
导航视图{
VStack{
文本(“你好,世界!”)
.padding()
名单{
部分{
导航链接(目的地:文本(“子屏幕”),标记:“链接1”,选择:$selection){
文本(“子屏幕1”)
}翁迪萨佩尔先生{
self.selection=nil
}
导航链接(目的地:文本(“子屏幕2”),标记:“链接2”,选择:$selection){
文本(“子屏幕2”)
}翁迪萨佩尔先生{
self.selection=nil
}
}.id(“idSection1”)
}
.id(“空闲者”)
}
}
}
}

这肯定是
列表中的一个bug,现在,我的工作是通过更改id来刷新
列表,如下所示:

struct YourView:View{
@国家私有变量selectedItem:String?
@国家私有变量listViewId=UUID()
var body:一些观点{
列表(项目,id:\.id){
导航链接(目的地:文本($0.id),
标签:$0.id,
选择:$selectedItem){
文本(“行\($0.id)”)
}
}
.id(listViewId)
奥纳佩尔先生{
如果选择editem!=nil{
selectedItem=nil
listViewId=UUID()
}
}
} 
}
我基于此制作了一个修改器,您可以使用:

struct RefreshOnAppearModifier:ViewModifier{
@国家私有变量viewId=UUID()
@绑定变量选择:标记?
func正文(内容:内容)->某些视图{
内容
.id(视图id)
奥纳佩尔先生{
如果选择!=nil{
viewId=UUID()
选择=零
}
}
}
}
扩展视图{
func refreshOnAppear(选择:Binding?=nil)->一些视图{
修改器(RefreshOnAppearModifier(选择:选择???.常数(零)))
}
}
像这样使用它:

列表{…}
.refreshOnAppear(选择:$selectedItem)

我也遇到了这个问题,我相信我在我的案例中找到了根本原因

struct Page1View: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink("Page 2", destination: Page2View())
            }
                .listStyle(GroupedListStyle())
                .navigationBarTitle("Page 1")
        }
    }
}

struct Page2View: View {
    var body: some View {
        List {
            NavigationLink("Page 3", destination: Text("Page 3"))
        }
            .listStyle(GroupedListStyle())
            .navigationBarTitle("Page 2")
    }
}
2021-02-13 16:41:00.599844+0000 App[59157:254215] [Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.
struct Page1View: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink("Page 2", destination: Page2View())
            }
                .listStyle(GroupedListStyle())
                .navigationBarTitle("Page 1")
        }
            .navigationViewStyle(StackNavigationViewStyle())
    }
}

import SwiftUI
import Introspect

struct MyView: View {

    @State var reload: (() -> Void)? = nil

    var body: some View {
        NavigationView {
            List {
                NavigationLink("Next", destination: Text("Hello"))
            }.introspectTableView { tv in
                self.reload = tv.reloadData
            }.onAppear {
                self.reload?()
            }
        }
    }
}