Comment utiliser Bundle dans SwiftUI avec image
Par exemple : j'ai Bundle dans le projet, il s'appelle "Game.Bundle"
let b :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
Image("Giyuu",bundle:self.b)
mais Bundle ne fonctionne pas.
comment puis-je utiliser un bundle personnalisé
Réponses
SwiftUI Image(_ , bundle: _)recherche la ressource d'image dans le catalogue d'actifs du bundle correspondant. Dans votre cas, l'image est simplement intégrée en tant que fichier normal, vous devez donc la rechercher et la charger en tant que fichier. Imagelui-même ne peut pas faire cela, il devrait donc être construit avec UIImagequi a une telle possibilité.
Donc, en supposant que vous êtes Game.bundledans le PlugInssous-dossier du bundle principal (sinon - juste la construction correcte du chemin correspondant ci-dessous), voici une approche possible.
Testé avec Xcode 12 / iOS 14
struct ContentView: View {
var body: some View {
Image(uiImage: gameImage(name: "test") ?? UIImage())
}
func gameImage(name: String, type: String = "png") -> UIImage? {
guard let plugins = Bundle.main.builtInPlugInsPath,
let bundle = Bundle(url: URL(fileURLWithPath:
plugins).appendingPathComponent("Game.bundle")),
let path = bundle.path(forResource: name, ofType: type)
else { return nil }
return UIImage(contentsOfFile: path)
}
}
Votre extrait tel qu'il est fourni semble faire référence à bla fois en selftant qu'instance et en tant que variable locale
let b :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
Image("Giyuu",bundle:self.b)
Vouliez-vous?
let bundle :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
let image = Image("Giyuu",bundle:bundle)
Ou refactorisé pour éliminer la force de déballage !avec une analyse de problème ajoutée.
func getGiyuuImage() -> Image {
guard let path = Bundle.main.path(forResource:"Game", ofType:"bundle"), let bundle = Bundle(path: path) else {
fatalError("dev error - no Game bundle")
}
let image = Image("Giyuu",bundle: bundle)
return image
}