【问题标题】:Get total count of files in resource folder - SwiftUI获取资源文件夹中的文件总数 - SwiftUI
【发布时间】: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。这一切都很完美。

问题

我在这里尝试做两件事。

  1. 我想获取所有子目录中所有 pdf 的总数
  2. 我还有一个选项,用户可以选择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 计算一次文件数

标签: ios xcode swiftui


【解决方案1】:

totalCount 返回 nil,因为我不确定如何查看每个文件夹并将其添加到数组中?

如果您使用默认的 Xcode 复制包资源阶段将资源复制到应用程序包中,那么所有资源文件都位于您的应用程序包中,即。没有子文件夹,这就是为什么 pdfCount 得到 0。

您需要从目标副本捆绑资源阶段删除资源并创建自定义副本资源阶段,该阶段将使用 pdf 文件复制您的自定义文件夹。

一旦此类子目录出现在应用程序包中(您可以通过在 Finder 中查看应用程序包来验证这一点)下一个方法开始工作

Bundle.main.urls(forResourcesWithExtension:... , subdirectory:...)

这是它在 Finder 中的 Xcode 和应用程序包中的外观

我已设法列出所有子目录名称,但没有 pdf 名称。

一旦你完成了之前的,这个就会自动开始工作。

【讨论】:

  • 感谢您的详细回复。我已经更新了我的问题,以更好地解释它是如何设置的,因为其中一些已经在工作。请您看一下。
猜你喜欢
  • 2016-08-06
  • 2010-12-02
  • 2014-07-12
  • 2019-03-24
  • 2011-09-17
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多