IOS Framework故障加载加载嵌入式资源plist文件

时间:2014-04-04 20:06:34

标签: objective-c bundle

在我的Iphone应用程序中,我之前通过执行以下代码将标准plist文件加载到Dictionary中。最近我将源文件和plist文件复制到一个新的包中,我将其编译成一个框架并在原始应用程序中使用。所有代码都在运行,但plist加载代码无法再找到settings.plist文件。看看路径,它似乎仍然在查看主要应用程序的文件。

我是否需要以某种方式更新此捆绑包以读取嵌入式资源的框架?

NSBundle *bundle = [NSBundle mainBundle];
NSString  *path = [[bundle resourcePath] stringByAppendingPathComponent:@"settings.plist"];
_plistDictionary = [[NSDictionary alloc] initWithContentsOfFile:path];

2 个答案:

答案 0 :(得分:7)

如果我正确理解你,是的。

+[NSBundle mainBundle]返回与当前应用程序可执行文件所在目录对应的NSBundle对象。简而言之,它将返回主应用程序的捆绑包,这不是您想要的(您希望在您的应用程序捆绑中使用框架捆绑包)。

由于您希望获取框架的包,如果加载该plist的代码驻留在框架本身中,您可以执行以下操作:

NSBundle* bundle = [NSBundle bundleForClass:[self class]];

然后将返回框架的包。或者更具体地说,该类(此代码)所在的包。

答案 1 :(得分:1)

老问题,但希望这有助于某人...

尝试在嵌入式框架中找到资源(在我的情况下,是一个nib文件),NSBundle.mainBundle()对我来说也不起作用。我设法通过使用这个非常迂回的方法(Swift代码)找到它:

if let frameworkURL = NSBundle(forClass: MyClass.self).URLForResource("MyFrameworkName", withExtension: "framework", subdirectory: "Frameworks") {
    if let bundle = NSBundle(URL: frameworkURL) {
        if let resourceURL = bundle.URLForResource("MyResourceName", withExtension: "nib") {
            // do something with resourceURL
        }
    }
}

根据您的需要更改MyClass"MyFrameworkName""MyResourceName""nib"

似乎必须有更好的方法,但还不确定它是什么。

(提示:通过获取NSBundle.mainBundle().bundlePath的值,然后在Finder中打开该路径来浏览已编译的应用包中的文件。)