【发布时间】:2021-02-17 15:01:11
【问题描述】:
大纲
我有一个包含多个子目录的资源文件夹。在每个子目录中都有多个 .pdf。它看起来像这样:
我还有一个存储顶级资源文件夹名称的数据模型以及一个包含所有子目录资源文件夹名称的数组,如下所示:
struct ProductModel: Identifiable {
var id = UUID()
var headerTitle: String
var application: [String]
}
let productData: [ProductModel] = [
ProductModel(
headerTitle: "DMA-80 evo",
application: ["All", "Beverages","Chemicals", "Clinical", "Coal", "Cosmetics", "Energy","Environmental", "Geochemistry"],
),
]
在我的第一个视图中,我列出了所有应用程序,如果用户选择一个应用程序,它将存储在我的ObservableObject 中,您可以在此处看到:
class selectedApplication: ObservableObject {
@Published var selectedApplication = "All"
@Published var selectedProduct = ""
}
struct ProductList2: View {
@ObservedObject var selectedOption = selectedApplication()
var products: [ProductModel] = productData
var body: some View {
ScrollView(.horizontal){
HStack{
ForEach(applicationsArray, id: \.self) { item in
Button(action: {
self.selectedOption.selectedApplication = item
}) {
Text(item)
}
}
}
}
}
}
然后我导航到第二个视图并列出文件夹中与所选应用程序匹配的所有pdfs。例如,如果选择了饮料,当导航到第二页时,它会在列表中显示Fruit Juice, Spirit, Sugar & Wine。这一切都很完美。
问题
我在这里尝试做两件事。
- 我想获取所有子目录中所有 pdf 的总数
- 我还有一个选项,用户可以选择
All。这将显示属于DMA-80 eve的所有pdfs。我想做的是在分组菜单列表中列出所有 pdf,其中部分标题是子目录文件夹的名称(即饮料、化学品)。
这就是我所拥有的,但我无法制定接下来的步骤。
struct ProductTab5NoteRow: View {
@ObservedObject var application: selectedApplication
@State var pdfURL: URL?
var product: ProductModel
var body: some View {
List{
let bundleLoc = product.headerTitle + "/" + application.selectedApplication
let pdfs = Bundle.main.urls(forResourcesWithExtension: "pdf", subdirectory: bundleLoc) ?? []
ForEach(pdfs, id: \.self) { pdf in
Button(action: {
self.pdfURL = pdf
}, label: {
VStack(alignment: .leading) {
Text((pdf.lastPathComponent ?? "").dropLast(4))
Text(application.selectedApplication)
}
})
}
}
}
}
-
totalCount返回 nil,因为我不确定如何查看每个文件夹并将其添加到数组中? - 我已设法列出所有子目录名称,但没有 pdf 名称。
任何帮助将不胜感激,因为我完全迷路了。谢谢。
【问题讨论】:
-
那是因为您使用的方法只返回给定子目录中的 url,而不是任何进一步的子级别。
-
我认为它会自动查找所有子目录。这是否意味着它需要在 for 循环中遍历每个子目录?
-
Bundle 在运行时是不可变的。所以实际上你应该知道 PDF 文件的数量。
-
好的。你是说我应该将总数硬编码到数据结构中吗?
-
是的,我是。您可以编写一个 bash 脚本,使用
find计算一次文件数