所选列表行';返回列表(SwiftUI)后,s的背景仍为灰色(选定)。iOS14&x2B;代码12

所选列表行';返回列表(SwiftUI)后,s的背景仍为灰色(选定)。iOS14&x2B;代码12,swiftui,ios14,xcode12,Swiftui,Ios14,Xcode12,从局部视图返回后,选定行将保持灰色。发生在模拟器和真实设备上,仅在iOS 14上。是否有人知道如何删除它,使其与iOS 13上的行为相同(不保持选中状态)? 这是项目中唯一的代码。(没有其他导航或任何内容) 我实际上找到了一个解决办法,使用lazystack,然后将行/单元格与一些填充和分隔符放在一起。但性能比列表差得多 编辑 如果您将列表放在另一个视图的之外(在您的示例中,不要将其嵌入到VStack中),它将正常工作。因此,您必须将列表放在单独的视图结构中,并将其嵌入到ContentView中

从局部视图返回后,选定行将保持灰色。发生在模拟器和真实设备上,仅在iOS 14上。是否有人知道如何删除它,使其与iOS 13上的行为相同(不保持选中状态)? 这是项目中唯一的代码。(没有其他导航或任何内容)


我实际上找到了一个解决办法,使用lazystack,然后将行/单元格与一些填充和分隔符放在一起。但性能比列表差得多

编辑 如果您将列表放在另一个视图的之外(在您的示例中,不要将其嵌入到VStack中),它将正常工作。因此,您必须将列表放在单独的视图结构中,并将其嵌入到ContentView中。大概是这样的:

    struct ExtractedListView: View {
     var listItems:[something]
        List(listItems, id: \.self) { item in
           NavigationLink(destination: Text(item)) {
             Text(item)
          }
    }


struct ContentView : View {
   NavigationView {
    VStack {
       Text("Hello")
       ExtractedListView(listItems: items)
    }
  }
}

我一使用
StackNavigationViewStyle()
就遇到了同样的问题。
通过使用
DefaultNavigationViewStyle()

我自己解决了这个问题,下面是我的工作方式。我发现了一些非常罕见的情况,突出显示消失有点滞后,但到目前为止,它帮助了很多。 本例使用MVVM模式,希望您能理解

您可以使用此第三方库访问SwiftUI列表后面的基础UITableView:

然后,您可以存储tableView实例,并在表出现和消失时刷新选择(不知何故,在这两种情况下都这样做效果更好,因为这些块的执行可能会有一点滞后,这取决于用户导航的积极程度)

在viewModel中,以下是函数

func bindToTableView(_ tableView: UITableView) {
    self.tableView = tableView
}

func clearTableViewSelection() {
    // This is a iOS14 hack that prevents clicked cell background view to remain highlighted when we come back to the screen
    if #available(iOS 14, *){
        DispatchQueue.main.async {
            if let selectedIndexPath = self.tableView?.indexPathForSelectedRow {
                self.tableView?.deselectRow(at: selectedIndexPath, animated: false)
                if let selectedCell = self.tableView?.cellForRow(at: selectedIndexPath) {
                    selectedCell.setSelected(false, animated: false)
                }
                
            }
        }
    }
}

你可以这样包装你的视图,这很有用,尤其是当你使用列表等。这个解决方案也摆脱了插入符号

ZStack {
     NavigationLink(destination: DestinationView()) {
         EmptyView()
     }

     Rectangle().background(Color(UIColor.systemBackground)).foregroundColor(Color(UIColor.systemBackground))
                    
     ViewToClick()
}

以下是对我有效的方法:

@State var selection: Int? = nil

var body: some View {
    List {
        ForEach(self.model.data, id: \.self) { item in
            ZStack {
                
                Button("") {
                    self.selection = item.id
                }
                NavigationLink(destination: ItemView(item: item), tag: item.id, selection: self.$selection) {
                    Spacer()
                }.hidden()
                ItemRow(item: item)

            }
            
        }
    }
}

这就是诀窍。只需创建一个ZStack并在上面放置一个空按钮

var主体:一些视图{
名单{
ForEach(数据,id:\.self){中的项
ZStack{
按钮(“”{}
导航链接(目的地:项目视图(项目:项目)){
ItemRow(项目:项目)
}
}
}
}
}

您找到解决问题的方法了吗?很遗憾,我在新项目中使用了
SwiftUI
!真可笑,苹果怎么会把东西弄坏。。。这是一个简单的列表。。。。我所做的是在iOS13上使用List,在iOS14上使用LazyVStack。但若列表也能在iOS14上运行那个就太好了。我也在使用LazyVStack,但它只适用于iOS14。如果苹果修复了这个列表,那就太好了。最糟糕的是,我的iPad版应用在iOS13上看起来非常专业。关于导航视图和链接,我只需要调整两件小事。看起来真的很酷。太酷了,我用它来展示SwuftUIs很棒的功能。现在在iPad上,它甚至比iOS14下iPhone上的“bug”还要糟糕。。。不同颜色单击单元格时,列表中的所有内容都会高亮显示。我不知道他们怎么会不检查有关List()和NavigationView/-Link的内容是否会在iOS14中中断。我猜超过60%的应用程序使用表…在将列表放入自己的视图结构后仍然存在同样的问题。如果您能分享一个从Xcode复制的工作示例,我将不胜感激。如果您想使用
StackNavigationViewStyle
但不想出现问题,该怎么办?
ZStack {
     NavigationLink(destination: DestinationView()) {
         EmptyView()
     }

     Rectangle().background(Color(UIColor.systemBackground)).foregroundColor(Color(UIColor.systemBackground))
                    
     ViewToClick()
}
@State var selection: Int? = nil

var body: some View {
    List {
        ForEach(self.model.data, id: \.self) { item in
            ZStack {
                
                Button("") {
                    self.selection = item.id
                }
                NavigationLink(destination: ItemView(item: item), tag: item.id, selection: self.$selection) {
                    Spacer()
                }.hidden()
                ItemRow(item: item)

            }
            
        }
    }
}