我在 macCatalyst 上使用 NavigationView
时遇到了一个奇怪的问题。下面是一个带有侧边栏和详细 View 的简单应用程序。选择侧边栏上的项目会显示带有可滚动列表的详细 View 。
第一个 NavigationLink
一切正常,详细 View 显示并且可以自由滚动。但是,如果我选择一个触发第二个详细 View 链接的列表项,则滚动开始,然后卡住。该应用程序仍然可以运行,只是详细 View 滚动被锁定。
相同的代码在 iPad 上运行良好,没有任何卡住。如果我针对 macOS 进行构建,详细 View 中的 NavigationLink 将不起作用。
有任何已知的解决方法吗?
这就是它的样子,点击 LinkedView 后,短暂滚动,然后 View 卡住。仍然可以单击后退按钮或侧边栏上的其他项目,但 ListView 被阻止。
代码如下: ContentView.swift
import SwiftUI
struct ContentView: View {
var names = [NamedItem(name: "One"), NamedItem(name: "Two"), NamedItem(name:"Three")]
var body: some View {
NavigationView {
List() {
ForEach(names.sorted(by: {$0.name < $1.name})) { item in
NavigationLink(destination: DetailListView(item: item)) {
Text(item.name)
}
}
}
.listStyle(SidebarListStyle())
Text("Detail view")
}
}
}
struct NamedItem: Identifiable {
let name: String
let id = UUID()
}
struct DetailListView: View {
var item: NamedItem
let sections = (0...4).map({NamedItem(name: "\($0)")})
var body: some View {
VStack {
List {
Text(item.name)
NavigationLink(destination: DetailListView(item: NamedItem(name: "LinkedView"))) {
listItem(" LinkedView", "Item")
.foregroundColor(Color.blue)
}
ForEach(sections) { section in
sectionDetails(section)
}
}
}
}
let info = (0...12).map({NamedItem(name: "\($0)")})
func sectionDetails(_ section: NamedItem) -> some View {
Section(header: Text("Section \(section.name)")) {
Group {
listItem("ID", "\(section.id)")
}
Text("")
ForEach(info) { ch in
listItem("Item \(ch.name)", "\(ch.id)")
}
}
}
func listItem(_ title: String, _ value: String, tooltip: String? = nil) -> some View {
HStack {
Text(title)
.frame(width: 200, alignment: .leading)
Text(value)
.padding(.leading, 10)
}
}
}
TestListApp.swift
import SwiftUI
@main
struct TestListApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
最佳答案
我在使用 Mac Catalyst 应用程序时也遇到了同样的问题。在真实设备(带有 iOS 14.4.2 的 iPhone 7)上没有问题,但在 Mac Catalyst(带有 Big Sur 11.2.3 的 MacBook Pro)上,导航 View 中的滚动非常随机,正如您所解释的。我发现问题出在 Macbook 的触控板上,并且与滚动指示器有关,因为使用外部鼠标时不存在该问题。因此,解决此问题的最简单方法是在导航 View 中隐藏垂直滚动指示器。至少它对我有用。下面是 Root View “ContentView”中的一些代码,我是如何做到的。不幸的是,失去大数据的滚动指示器,但至少滚动是有效的。
import SwiftUI
struct TestView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: NewView()) {
Text("Navigation Link to new view")
}
}
.onAppear {
UITableView.appearance().showsVerticalScrollIndicator = false
}
}
}
}
关于swift - 催化剂导航 View 上的列表滚动卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66087776/