【问题标题】:NSBundle, plist and other resources in an Obj-c Static LibraryObj-c 静态库中的 NSBundle、plist 和其他资源
【发布时间】:2010-12-12 01:43:39
【问题描述】:

我在 Xcode 中创建了一个静态库,我可以在其他项目中成功使用它。但是,对于 plist 之类的资源,我发现我必须在使用该项目的主项目中包含我的库中引用的任何 plist。

在我的静态库项目中,我的 plist 包含在目标的“复制捆绑资源”阶段。在我的代码中,这就是我正在做的事情:

NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath   = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"];

NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

如果我使用 mainBundle 并且 MyClassParams.plist 包含在主项目中,一切都很好。如果 MyClassParams.plist 包含在库项目中,则它不起作用。

假设 [NSBundle mainBundle] 引用了错误的静态方法,我将其替换为:

NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]];

这也不起作用。

那么,是否可以在静态库中包含 plist 或任何其他资源——或者我必须在使用该库的项目中包含我需要的任何内容?

【问题讨论】:

  • 从这个问题开始赏金——从 iOS 4.2 开始,接受的答案仍然正确吗?

标签: iphone plist nsbundle


【解决方案1】:

静态库不在捆绑包中,当它们链接到应用程序时,它们是该应用程序捆绑包的一部分。在 iPhone 上,您编写的所有代码实际上都在 mainBundle 中,因为您不能包含嵌入式框架。

所以是的,您需要将所有资源复制到您将静态框架链接到的项目中。

【讨论】:

    【解决方案2】:

    我知道您不能将资源文件包含到静态库中(框架就是这样做的)。 我在我的项目中使用了另一种解决方案:

    在静态库“YYY”项目内:

    • 我在我的静态库项目中添加了一个“Loadable Bundle”目标(Add Target、Cocoa、Loadable Bundle)
    • 我将此目标添加为静态库目标的依赖项

    主项目内部:

    • 链接libYYY.a
    • 将包YYY.bundle添加到复制的资源文件中

    这样,静态库中使用的资源文件不在主项目中管理。假设我在静态库中有一张foo.png 的图片,我使用

    [UIImage imageNamed:@"YYY.bundle/foo.png"]
    

    然后你可以像这样得到你的 plist:

    NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]];
    NSString *filePath   = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"];
    
    NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
    

    下面,两张截图:

    • :带有可加载捆绑目标的静态库项目
    • :显示添加到“Link Binary With Libraries”中的静态库二进制文件和添加到“Copy bundle Resources”中的资源包。

    【讨论】:

    • 嗨jilouc。 .我坚持最后一步。 .什么是复制的资源文件? .请解释
    • @thndrkiss 只需将捆绑文件拖放到您的资源中(就像您对任何其他资源文件所做的那样)并将其添加到您的项目目标中。我添加了一个屏幕截图。
    • 吉尔。 .我有个疑问 。 .i 从 /projectname/staticprojectfolder/build/Release-iphonesimulator 添加了 test.bundle。 。那是对的吗 ?当我在移动设备上构建我的应用程序时会发生什么?它会正常工作吗?应该在哪里进行实际参考。 .
    • @thndrkiss 因为它只包含图像或其他资源,您可以使用任何生成的包。 (但如果您愿意,您可以为“设备”构建静态库并使用 /projectname/staticprojectfolder/build/Release-iphoneos 中的捆绑包)
    • 通过“复制捆绑资源”步骤,浏览到构建位置后,请确保通过“文件夹引用”添加它以使其正常工作。
    【解决方案3】:

    我遵循了@Jilouc 建议的所有内容,但是,我可以获取捆绑包,但无法获取其中的文件。我尝试了两种方式(@"yyy.bundle/image"staticlib pathforresource...

    然后我用下面的方法,成功了!

    NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]];
    
    NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName];
    
    NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];
    

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多