所以我有一个主要的iOS应用程序,其中包含我制作的框架。
在这个框架中,我创建了一个Localizable助手以及一个Date助手。
日期助手有一个函数timeAgo()
,它可以返回“8小时前”。我想要本地化这个字符串。所以我在我的框架中有这样的东西:
public extension String {
public func localized(in bundle: Bundle) -> String {
if let path = bundle.path(forResource: Localize.currentLanguage(), ofType: "lproj"),
let bundle = Bundle(path: path) {
return bundle.localizedString(forKey: self, value: nil, table: nil)
}
return self
}
}
public extension Date {
public func timeAgo(format: DateUnitFormat = .short) -> String {
let thisFrameworkBundle = Bundle(for: Localize.self) // Class declared in the framework
//Whatever, just display a localized word
return "second".localized(in: thisFrameworkBundle)
}
}
当我运行本地测试(在框架内部进行单元测试)时,本地化的东西起作用。找到了捆绑包。
但是当我从主应用程序中调用timeAgo
时,它就不再起作用了。
我尝试将此行let thisFrameworkBundle = Bundle(for: Localize.self)
更改为let thisFrameworkBundle = Bundle(identifier: "com.myIdentifier")
,同样的事情(因此它在框架内工作,但在从主应用程序调用时无效)。
修改
好的,所以我注意到Bundle(identifier: "com.myIdentifier")
在框架内不起作用,因为我正在使用Cocoapods并且它用cocoapod覆盖了框架标识符。但是,我仍然不明白为什么使用Bundle(for: FrameworkClass.self)
无法在主应用程序中工作(但在框架的单元测试中工作)
答案 0 :(得分:0)
此时此刻,我可以给你两种方式。去年我一直在使用它:
extern "C" void api_create_sand_c_side_from_cfg_file(const char* cfg_file_name);
键片段将public func returnImage(_ named:String) -> UIImage {
let myBundle = Bundle.init(identifier: "com.[company].[framework]")
let imagePath = (myBundle?.path(forResource: "images", ofType: "bundle"))! + "/" + named
let theImage = UIImage(contentsOfFile: imagePath)
return theImage!
}
变量绑定到项目中定义的Bundle ID。
我订阅了一个名为UseYourLoaf的博客。非常非常好的资源。今天他们的post包含了一种非常不同的方法 - 使用类和myBundle
。我只是发表评论,询问我们的方法之间的利弊。
我可以告诉你的是,如果你命名为BundleID,你可以使用我的例程来获取资源。