【问题标题】:NSBundle pathForResource is NULLNSBundle pathForResource 为 NULL
【发布时间】:2011-04-26 08:23:05
【问题描述】:

我正在使用 xcode 和 objc 创建一个简单的应用程序,我需要从文件加载 NSDictionary,但我无法使用 NSBundle 获取文件的路径:

NSString *l = [[NSBundle mainBundle] pathForResource:@"LoginStatuses" ofType:@"plist"];
NSLog(@"%@", l);

当我运行这段代码时,我得到了这个:

2010-10-16 10:42:42.42 样本[5226:a0f] (null)

我不知道为什么。

我创建了一个名为 Resources 的组,并在其中添加了 LogingStatuses.plist:

【问题讨论】:

    标签: objective-c xcode nsbundle


    【解决方案1】:

    所以这是我拿到源码后解决这个问题的方法:

    我并没有真正注意发布的屏幕截图,但目标是“命令行工具”类型......并且因为这些没有捆绑[NSBundle mainBundle]当然返回零。 Xcode 并没有抱怨它无法执行“复制捆绑资源”步骤,这很容易引起误解,它只是默默地跳过它。

    解决方案只是添加一个类型为“Application”的新目标,以便生成基于捆绑包的应用程序。然后选中 Target Membership 复选框以查看此新目标的所有来源和资源。然后正确解析 plist 路径。

    【讨论】:

    • 我也在使用项目类型Command-line Tool,但无法从NSBundle pathForResource 加载文件。我应该切换到Cocoa Application 项目类型吗?我不确定我是否遵循您添加新Application 目标的建议;您的意思是在现有的命令行工具项目中添加一个新目标?
    • 是的,我的意思是为您现有的项目添加一个新目标(应用程序类型)。普通的命令行工具只是一个没有捆绑包的可执行文件。您添加到 Command-line Tool 目标的任何资源都会被忽略(但 Xcode 不会对此发出警告)。
    • 命令行工具目标仍然可以使用 NSBundle pathForResource 链接文件。您需要告诉应用程序在构建时将文件复制到产品目录中。进入“构建阶段”选项卡,单击“添加构建阶段”,然后选择“添加复制文件”。然后只需拖动您需要的文件。
    • 很好的答案@DarkDust
    【解决方案2】:

    我试图让我的 iPhone 应用程序使用默认的 sqlite 数据库,但该死的应用程序找不到它。原来我必须确保 .sqlite 文件在捆绑资源中。

    1. 选择您的项目
    2. 选择目标
    3. 选择构建阶段选项卡
    4. 打开标有“复制捆绑资源”的部分
    5. 将 .sqlite 文件拖放到此部分。

    现在您的应用将找到这个默认的 sqlite 数据库。

    【讨论】:

    • 我发现 Xcode 会自动将某些类型的文件添加到 Copy Bundle Resources 阶段,而将其他类型的文件排除在外。例如,会自动添加 .html 文件(以及 .strings、.png 等),但不会自动添加 .js 文件。
    • 添加到xcode不会自动成为.epub文件的列表
    • Xcode 也不会自动在资源中包含 shell 脚本。
    • 如果我使用 Xcode 构建我的项目,但不使用 swift build,这将有效。有什么解决办法吗?
    • @JayWong4 使用 build 命令会发生什么?您收到错误消息了吗?
    【解决方案3】:

    文件是否真的包含在目标中(因此会被复制到包中)?有两种方法可以找出/设置它:

    第一种方法:右键单击(或 Cmd 单击)文件,选择“获取信息”。然后点击“Targets”选项卡并确保检查文件是否有所需的目标。

    第二种方法:在项目浏览器中右键单击(或 Cmd-clock)文件浏览器的标题(它可能会读取“组和文件”)。然后选择“目标会员”。现在,每个可以成为目标成员的文件(如 .m 文件或资源)旁边都有复选框。再次确保选中文件旁边的复选框。

    【讨论】:

    • 感谢回复,但文件似乎已添加到目标中-> grab.by/6TG4
    • @Patrick:您的目标称为 MetwitApi... 这是否意味着您在其他应用程序中使用该捆绑包?如果是这样,那么mainBundle 将是错误的......相反,请尝试bundleForClass:[SomeClassFromApi class]
    • 是一样的 :(你想要我可以把xcode项目发给你。
    • 我通常不这样做,但没关系。您可以在我的主页底部找到我的电子邮件地址。
    • @Patrick:关于礼仪的简短说明。人们自愿在网站和邮件列表上花费时间来帮助社区和个人。它不会帮助任何未来的网站访问者找到您的问题,因为当您公开发布然后将事情脱机时,他们遇到了同样的问题。将单枪匹马地帮助您解决问题的人“锁定”也被认为是一种不好的形式。通过将问题和答案保留在社区中,让社区提供帮助。这样一来,您将获得良好的声誉并帮助帮助者做到这一点。
    【解决方案4】:

    由于我在这里google了一下,没有找到答案,后来自己发现了,就放在这里吧……

    我有 2 个文件:tray.pngtray@2x.png 用于 Retina。这些文件被自动添加到“复制捆绑资源”中。

    但是:

    [[NSBundle mainBundle] pathForResource:@"tray" ofType:@"png"];
    

    没有返回实际复制到包中的文件!原因是:IDE创建了一个TIFF文件tray.tiff(联合tray.pngtray@2x.png),所以... ofType:@"tiff"]帮助!

    【讨论】:

    • 有一个名为 Combine high resolution artwork / COMBINE_HIDPI_IMAGES 的构建设置可以禁用此功能。
    【解决方案5】:

    我的问题和解决方案与 Dmitriy Isaev 的问题和解决方案非常相似。我试图获取 xib 文件的路径。两个调用(在 Swift 中) pathForResource("myfile", ofType: "xib") 和 pathForResource("myfile.xib", ofType: nil) 都失败了。

    解决办法是改用扩展“nib”:

    pathForResource("myfile", ofType: "nib")
    

    【讨论】:

      【解决方案6】:

      我今天在命令行项目中遇到了这个问题。

      幸运的是,解决方案很简单。只需转到“构建阶段”,单击“+”并添加一个新的“复制文件”阶段。选择“资源”作为目标,然后添加您要使用的任何文件。

      现在您仍然可以使用[NSBundle mainBundle],它应该可以工作了!

      【讨论】:

      • 这解决了我升级到 Xcode 8.1 后的问题。 *** 警告:在 OS X 10.1.66 下安装时,Xcode 8.1 没有命令行工具。
      • 它也适用于我。但我想知道 1) 是否干净?我已经有一个复制文件阶段。 2) 创建另一个包 (Resource.bundle) 会不会更干净,将所有资源放在那里并将 CLP 与 resource.bundle 链接?
      【解决方案7】:

      在我的情况下(执行 XCTestCase)由于某种原因资源存储在非主包中。我通过首先检查哪个捆绑测试类属于来解决了这个问题:

      [[NSBundle bundleForClass:[self class]] pathForResource:@"Config" ofType:@"plist"];
      

      希望这也可以帮助其他人。

      【讨论】:

        【解决方案8】:

        文件名在 iPad 上区分大小写。您需要使用小写字母。

        【讨论】:

        • 嗯,一致的套管。不一定是“小”,但是是的。这对我来说是个问题。 :)
        【解决方案9】:

        确保正确拼写资源的文件名。我只是以艰难的方式学到了这一点。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          相关资源
          最近更新 更多