我整理了一个快速的文件夹浏览器,以查看子文件夹中的一堆图像。基本上,给定路径,它将查找文件夹,并为您提供一个按钮来展开文件夹并显示其中的图像。
下面是我编写的代码。但是,如果List
单元格不在屏幕上绘制,则Button
一旦滚动到视图中就永远不会显示。有人可以复制吗?我如何解决它?这仅仅是SwiftUI中的错误吗?
在此使用列表:
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()
}
}
}
}
答案 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)
性能不佳,但最终仍能正常工作。