swift - 催化剂导航 View 上的列表滚动卡住

标签 swift swiftui swiftui-list mac-catalyst swiftui-navigationview

我在 macCatalyst 上使用 NavigationView 时遇到了一个奇怪的问题。下面是一个带有侧边栏和详细 View 的简单应用程序。选择侧边栏上的项目会显示带有可滚动列表的详细 View 。

第一个 NavigationLink 一切正常,详细 View 显示并且可以自由滚动。但是,如果我选择一个触发第二个详细 View 链接的列表项,则滚动开始,然后卡住。该应用程序仍然可以运行,只是详细 View 滚动被锁定。

相同的代码在 iPad 上运行良好,没有任何卡住。如果我针对 macOS 进行构建,详细 View 中的 NavigationLink 将不起作用。

有任何已知的解决方法吗?

这就是它的样子,点击 LinkedView 后,短暂滚动,然后 View 卡住。仍然可以单击后退按钮或侧边栏上的其他项目,但 ListView 被阻止。

enter image description here

代码如下: 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/

相关文章:

swift - 有没有办法在 watchOS 上运行 AudioKit?

具有 Float 类型的 Swift String 初始值设定项生成奇怪的值

swift - SwiftUI 中两个 View 之间的 HStack 差距

SwiftUI:调整弹出窗口的大小以适合

ios - 尝试重新访问之前在 SwiftUI 中单击的 NavigationLink 时,NavigationLink 卡住

ios - SwiftUI ForEach 无法推断复杂的闭包返回类型;添加显式类型以消除歧义

swift - 如何构建用于拖放拼图 block 的对齐网格功能?

ios - 如何在 Swift 中使用带有 #define 宏的 Objective-C 代码

swift - 快速实现完成 block

swiftui - 相对于另一个居中 View 定位 View