web-dev-qa-db-fra.com

Chemin vers le bundle du framework iOS

Je travaille sur un framework pour iOS, qui vient avec quelques fichiers de données. Pour les charger dans un Dictionary je fais quelque chose comme ceci:

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
}

Si je l'utilise dans une aire de jeux avec le cadre, cela fonctionne comme prévu.

Mais si j'utilise le framework intégré dans une application, cela ne fonctionne plus, le "chemin" pointe maintenant vers le bundle de l'application, pas du framework.

Comment puis-je m'assurer que le bundle du framework est accessible?

EDIT: le code ci-dessus réside dans le framework, pas dans l'application.

EDIT2: le code ci-dessus est une fonction utilitaire, et ne fait pas partie d'une structure ou d'une classe.

16
Koen

Utilisez Bundle(for:Type):

let bundle = Bundle(for: type(of: self))
let path = bundle.path(forResource: filename, ofType: type)

Mise à jour:

ou recherchez le bundle par identifier (l'ID du bundle des frameworks):

let bundle = Bundle(identifier: "com.myframework")
43
shallowThought

Essayez le code ci-dessous pour obtenir le pack personnalisé:

let bundlePath = Bundle.main.path(forResource: "CustomBunlde", ofType: "bundle")
let resourceBundle = Bundle.init(path: bundlePath!)

Mise à jour

Si dans votre framework, essayez ceci:

[[NSBundle bundleForClass:[YourClass class]] URLForResource:@"YourResourceName" withExtension:@".suffixName"];
4
aircraft

Spécifiez simplement le nom de classe de la ressource et la fonction ci-dessous vous donnera l'objet Bundle auquel la classe est associée, donc si la classe est associée à un framework, elle donnera le bundle du framework.

let bundle = Bundle(for: <YourClassName>.self)
0
Samuel Paul