Comment utiliser Bundle dans SwiftUI avec image

Aug 18 2020

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

1 Asperi Aug 18 2020 at 23:09

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)
    }
}
1 WarrenBurton Aug 18 2020 at 22:42

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
}