私はiOS用のフレームワークに取り組んでいます。これにはいくつかのデータファイルが付属しています。それらをDictionary
にロードするには、次のようにします。
public func loadPListFromBundle(filename: String, type: String) -> [String : AnyObject]? {
guard
let bundle = Bundle(for: "com.myframework")
let path = bundle.main.path(forResource: filename, ofType: type),
let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject]
else {
print("plist not found")
return nil
}
return plistDict
}
フレームワークのある遊び場でこれを使用すると、意図したとおりに機能します。
しかし、アプリに埋め込まれたフレームワークを使用すると、機能しなくなり、「パス」はフレームワークではなくアプリのバンドルを指すようになります。
フレームワークのバンドルに確実にアクセスできるようにするにはどうすればよいですか?
EDIT:上記のコードは、アプリではなくフレームワークに存在します。
EDIT2:上記のコードはユーティリティ関数であり、構造体またはクラスの一部ではありません。
Bundle(for:Type)
を使用します。
let bundle = Bundle(for: type(of: self))
let path = bundle.path(forResource: filename, ofType: type)
更新:
または、identifier
(フレームワークバンドルID)でバンドルを検索します。
let bundle = Bundle(identifier: "com.myframework")
以下のコードを試して、カスタムバンドルを取得してください。
let bundlePath = Bundle.main.path(forResource: "CustomBunlde", ofType: "bundle")
let resourceBundle = Bundle.init(path: bundlePath!)
更新
フレームワークの場合、これを試してください:
[[NSBundle bundleForClass:[YourClass class]] URLForResource:@"YourResourceName" withExtension:@".suffixName"];
リソースのクラス名を指定するだけで、以下の関数はクラスが関連付けられているBundleオブジェクトを提供するため、クラスがフレームワークに関連付けられている場合、フレームワークのバンドルを提供します。
let bundle = Bundle(for: <YourClassName>.self)