【问题标题】:iOS 8: get resource from Cocoa Touch FrameworkiOS 8:从 Cocoa Touch 框架获取资源
【发布时间】:2014-10-19 04:11:09
【问题描述】:

为了在我的应用程序和扩展程序之间共享代码和资源,我在我的项目中嵌入了一个Cocoa Touch Framework,这个框架包含一些资源,如图像和 xib 文件。

我的问题是:我如何从可能的主应用程序和扩展程序访问这些资源?

我以前用这个方法:iOS 8 Extension: how to use xib inside Cocoa Touch Framework in extensions?

但这会复制到应用程序包和扩展程序包中的所有资源,这不是一个好的重复。

有没有更好的办法?

更新:

现在我的主应用程序可以使用这样的代码来访问框架中的资源:

+(NSBundle*)frameworkBundle
{
    NSString *frameworkDirPath = [[NSBundle mainBundle] privateFrameworksPath];
    NSString *frameworkBundlePath = [frameworkDirPath stringByAppendingPathComponent:@"MyFramework.framework"];
    NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];

    return frameworkBundle;
}

但这不适用于扩展。

【问题讨论】:

    标签: ios cocoa-touch ios8


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 它抛出的路径与问题中的代码不同,为什么?我们应该使用什么?
    • 使用 bundleForClass 创建包比从路径创建更好。我在开发过程中遇到了这个问题,我们正在使用来自测试应用程序的 coredata momd 文件,之后我们将应用程序转换为框架并将 momd 添加为资源。现在正在使用 momd 文件的测试应用程序正在 mainBundle 中寻找它,而现在它不正确。 momd 文件在框架内移动。所以总是使用 bundleForClass 并提供最接近/直接使用资源的类。
    【解决方案2】:

    这对我有用:

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

    【讨论】:

    • 这仅适用于动态库,静态库返回 nil。
    【解决方案3】:

    对于 swift,请考虑使用:

    let bundle = NSBundle(forClass: self.dynamicType)
    

    【讨论】:

    • 这仅适用于 Swift 3+。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2017-06-01
    • 2015-08-26
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多