【问题标题】:How do I count a number of images in a folder reference in swift如何快速计算文件夹引用中的图像数量
【发布时间】:2015-08-28 17:38:19
【问题描述】:

我正在使用 Swift 开发自定义表情符号键盘,但我无法在名为“emojis”的文件夹引用中查找和计算图像。

编辑:澄清我的问题是,让内容总是以 nil 结尾。

.xcodeproj 文件所在位置的结构如下所示: EmojiBoard/emojis/emoji-0.png 等等。

我一直在尝试使用 NSFileManager,但没有成功。

let fileManager = NSFileManager.defaultManager()
let contents = fileManager.contentsOfDirectoryAtPath("emojis", error: &error)
println(contents)

这打印为零。我也试过“EmojiBoard/emojis”和“/EmojiBoard/emojis”。

我需要这个来确定有多少图像并将它们全部循环出来,而不必求助于疯狂的 switch 语句或类似的东西。

谢谢!

附:请注意,我使用 Swift 编码,而不是 Objective C。恐怕我不够熟练,无法将 C 编程转换为 swift。 D.S.

【问题讨论】:

    标签: ios iphone swift nsfilemanager


    【解决方案1】:

    如果您在将文件夹添加到项目时创建了文件夹引用,请像这样使用它(表情符号文件夹图标是蓝色文件夹):

    let resourceURL = Bundle.main.resourceURL!.appendingPathComponent("emojis")
    var resourcesContent: [URL] {
        (try? FileManager.default.contentsOfDirectory(at: resourceURL, includingPropertiesForKeys: nil)) ?? []
    }
    let emojiCount = resourcesContent.count
    print(emojiCount)
    

    如果您在将文件夹添加到项目时创建了组,请像这样使用它(表情符号文件夹图标是黄色文件夹):

    let resourceURL = Bundle.main.resourceURL!
    let resourcesContent = (try? FileManager.default.contentsOfDirectory(at: resourceURL, includingPropertiesForKeys: nil)) ?? []
    let emojiCount = resourcesContent.filter { $0.lastPathComponent.hasPrefix("emoji-") }.count
    print(emojiCount)
    

    【讨论】:

    • 这就像一个该死的魅力!非常感谢@leo!你已经弹出了我的 stackoverflow 樱桃;)
    • 完成!我现在注意到,当我关闭现有的表情符号并添加更多时,它们根本找不到。它们作为参考文件夹添加到键盘扩展组中。
    • @JonathandeJong 尝试隔离问题并打开一个新问题。您可以创建一个只读计算 var 来返回实际的文件夹内容,而不是使用 let 将其声明为常量。看我的编辑。我希望它有所帮助。但我认为编译后资源文件夹不能更改
    • 谢谢。更新的代码有效,但当我将 +“/emojis”添加到资源路径时,您的其他示例也有效。它现在完全可以工作了:)
    • 就像我说的第二个例子是如果你在添加文件夹引用时使用组而不是像你一样
    【解决方案2】:

    在没有访问 IDE 来测试此代码的情况下,我认为是这样的:

    let fileManager = NSFileManager.defaultManager()
    
    
    let contents = fileManager.contentsOfDirectoryAtPath(path, error: &error)
    
    
    for var index = 0; index < contents.count; ++index {
        println("File is \(contents[index])")
    }
    

    如果您将上面的“路径”替换为您的文档目录,则此代码应遍历整个文件夹并打印出所有文件。

    如果您只想计算项目数量,请执行以下操作:

    println("count is \(contents.count)")
    

    【讨论】:

    • 谢谢,但也许我不清楚。我的问题是我似乎无法为 contentsOfDirectoryAtPath 找到正确的路径。不管我放什么内容都是 nil
    【解决方案3】:

    问题(或至少是问题的主要部分)是您的路径。您不能传入只是文件名的路径。您需要一个指向您的应用程序可用的沙盒目录之一的绝对路径,例如文档目录。

    您的代码可能如下所示:

    let  documentsDir = NSSearchPathForDirectoriesInDomains(   
      NSSearchPathDirectory.DocumentDirectory,
      NSSearchPathDomainMask.UserDomainMask,
      true)[0] as! NSString
    let emojisPath = documentsDir.stringByAppendingPathCompnent("emojis")
    let contents = fileManager.contentsOfDirectoryAtPath(emojisPath, 
      error: &error)
    println(contents)
    

    (如果您的表情符号文件夹位于应用程序的文档文件夹中,这将起作用。如果您的表情符号位于您的应用程序包中(内置在应用程序中),您将需要完全使用不同的代码(使用 NSBundle 函数来获取包内的目录)。

    编辑:

    如果您想在应用程序包中查找文件,请使用 NSBundle 方法 resourcePath,然后使用 stringByAppendingPathCompnent 将文件夹名称附加到包的资源路径中,如上面的代码。

    【讨论】:

    • 我之前实际上已经尝试过这段代码,但正如你所说,如果傻瓜在文档文件夹中,它就可以工作。但是,图像位于应用程序包本身中。
    • @JonathandeJong 您发布的代码将永远无法在设备上运行。如果文件在应用程序的工作目录中,它可能在模拟器上工作,但永远不会在应用程序的包中找到文件。有关从应用程序包中的目录列出文件的信息,请参阅我的帖子的编辑。
    猜你喜欢
    • 2015-09-27
    • 2010-12-31
    • 1970-01-01
    • 2017-12-18
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多