iOS 8:从Cocoa Touch框架获取资源

5
为了在我的应用程序和扩展之间共享代码和资源,我将一个Cocoa Touch框架嵌入到我的项目中,该框架包含一些资源,如图像和xib文件。
我的问题是:我如何从我的主应用程序和扩展中访问这些资源?
我曾经使用过这种方法:iOS 8 Extension: how to use xib inside Cocoa Touch Framework in extensions?,但这将把所有资源复制到应用程序的bundle和扩展的bundle中,这不是一个好的做法。
有更好的方法吗?
更新:
现在我的主应用程序可以使用以下代码来访问框架中的资源:
+(NSBundle*)frameworkBundle
{
    NSString *frameworkDirPath = [[NSBundle mainBundle] privateFrameworksPath];
    NSString *frameworkBundlePath = [frameworkDirPath stringByAppendingPathComponent:@"MyFramework.framework"];
    NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];

    return frameworkBundle;
}

但对于扩展程序,这种方法不起作用。
3个回答

15

试试这个:

NSBundle *frameworkBundle = [NSBundle bundleForClass:[AnyClassFromFramework class]];

它抛出了与问题中的代码不同的路由,为什么?我们应该使用什么? - Gabriel Goncalves
使用bundleForClass创建bundle比使用路径创建更好。在开发过程中,我遇到了这个问题。我们从测试应用程序中使用coredata momd文件,然后将该应用程序转换为框架并将momd作为资源添加到其中。现在,消费momd文件的测试应用程序正在mainBundle中寻找它,但现在是不正确的。momd文件已经移动到框架内。因此,始终使用bundleForClass,并提供最接近/直接使用资源的类。 - Omkar

5
这对我有用:

这对我有用:

NSBundle * frameworkBundle = [NSBundle bundleWithIdentifier:@"<framework-bundle-identifier>"];

这仅适用于动态库,对于静态库它返回nil。 - njuxjy

0

对于 Swift,考虑使用以下内容:

let bundle = NSBundle(forClass: self.dynamicType)

仅适用于Swift 3+。 - emrekyv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接