在我的Iphone应用程序中,我之前通过执行以下代码将标准plist文件加载到Dictionary中。最近我将源文件和plist文件复制到一个新的包中,我将其编译成一个框架并在原始应用程序中使用。所有代码都在运行,但plist加载代码无法再找到settings.plist文件。看看路径,它似乎仍然在查看主要应用程序的文件。
我是否需要以某种方式更新此捆绑包以读取嵌入式资源的框架?
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [[bundle resourcePath] stringByAppendingPathComponent:@"settings.plist"];
_plistDictionary = [[NSDictionary alloc] initWithContentsOfFile:path];
答案 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中打开该路径来浏览已编译的应用包中的文件。)