我已经组装了一个快速文件夹资源管理器来查看子文件夹中的一堆图像。基本上,给定一个路径,它会查找文件夹,并为您提供一个按钮来展开文件夹并显示其中的图像。
下面是我整理的代码。然而,如果List
单元格被绘制在屏幕外,则一旦Button
滚动到视图中,它就永远不会出现。有人能复制这个吗?我该如何修复它?这只是SwiftUI中的一个bug吗?
编辑:为了清晰起见,这是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()
}
}
}
}
我已经为类似的问题提交了一个bug。我发现的一个解决方法是在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中添加一些样式来找到类似的解决方法。
好吧,不知怎么的,我偶然发现了这个问题的答案。一旦我给列表中的项目添加了.id修饰符,它们在屏幕外就停止了错误的渲染。
ListImageViewer(url: url)
.id(url)
性能很差,但最终还是如预期的那样工作。