SwiftUI列出屏幕外元素中的问题

时间:2019-11-21 15:10:46

标签: swiftui swiftui-list

我整理了一个快速的文件夹浏览器,以查看子文件夹中的一堆图像。基本上,给定路径,它将查找文件夹,并为您提供一个按钮来展开文件夹并显示其中的图像。

下面是我编写的代码。但是,如果List单元格不在屏幕上绘制,则Button一旦滚动到视图中就永远不会显示。有人可以复制吗?我如何解决它?这仅仅是SwiftUI中的错误吗?

编辑:为清楚起见,这是macOS Catalyst。

在此使用列表:

List(folderurls, id: \.self) { url in
    ListImageViewer(url: url)
}

这是ListImageViewer的完整代码:

struct ListImageViewer: View {
    var url: URL
    @State var expanded: Bool = false {
        didSet {
            if expanded {
                self.coordinator.refreshListing(for: self.url)
            } else {
                self.coordinator.contents = []
            }
        }
    }
    @ObservedObject var coordinator = FolderListingCoordinator()

    var body: some View {
        VStack {
            HStack {
                Button(action: {
                    self.expanded.toggle()
                }) { Text(self.expanded ? "Collapse" : "Expand") }
                Text("\(url.lastPathComponent)")
            }

            HStack {
                ForEach(coordinator.contents, id: \.self) { url in
                    ImageView(url: url)
                }
                Spacer()
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我已经提交了一个类似问题的错误。我发现的一种解决方法是在VStack中添加一个应用于其子视图的修改器。对我来说,我在绘制TextFields时遇到问题,所以我更改了以下内容:

var body: some View {
    Section(header: Text("Row \(row)")) {
        HStack(alignment: .center, spacing: 20) {
            Text("Name")
            Spacer()
            TextField("Name", text: $name)
                .frame(maxWidth: 120)
                .textFieldStyle(RoundedBorderTextFieldStyle())
        }
        HStack(alignment: .center, spacing: 20) {
            Toggle("Fixed", isOn: $isFixed)
        }
    }
}

var body: some View {
    Section(header: Text("Row \(row)")) {
        HStack(alignment: .center, spacing: 20) {
            Text("Name")
            Spacer()
            TextField("Name", text: $name)
                .frame(maxWidth: 120)                    
        }
        HStack(alignment: .center, spacing: 20) {
            Toggle("Fixed", isOn: $isFixed)
        }
    }.textFieldStyle(RoundedBorderTextFieldStyle())
}

您可以通过向包含的VStack中添加一些样式来找到类似的解决方法。

答案 1 :(得分:0)

很高兴,我偶然发现了这个问题的答案。在为列表中的项目提供.id修饰符后,它们在屏幕外显示时便停止了错误渲染。

ListImageViewer(url: url)
    .id(url)

性能不佳,但最终仍能正常工作。