3 votes

Comment utiliser Bundle dans SwiftUI avec Image

Par exemple : j'ai un 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 le Bundle ne fonctionne pas.

Comment puis-je utiliser un Bundle personnalisé

entrer la description de l'image ici

0 votes

La capture d'écran fournie ne montre pas l'image "skill2" dans Game.bundle. Êtes-vous sûr qu'elle est là?

0 votes

Oui j'ai mis à jour cette question

1 votes

Que ne fonctionne pas exactement?

2voto

Warren Burton Points 7953

Votre extrait tel qu'il est fourni semble faire référence à b à la fois dans self en tant 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 refactored pour éliminer les 'force unwraps' ! avec ajout d'une analyse de problème.

func getGiyuuImage() -> Image {
    guard let path = Bundle.main.path(forResource:"Game", ofType:"bundle"), let bundle = Bundle(path: path) else {
        fatalError("erreur de développement - pas de bundle Game")
    }
    let image = Image("Giyuu",bundle: bundle)
    return image
}

2voto

Asperi Points 123157

Le Image(_ , bundle: _) de SwiftUI recherche la ressource d'image dans le catalogue des ressources correspondant du bundle. Dans votre cas, l'image est simplement incorporée en tant que fichier normal, donc vous devez la trouver et la charger en tant que fichier. Image lui-même ne peut pas le faire, donc il devrait être construit avec UIImage qui a cette possibilité.

Donc, en supposant que votre Game.bundle est dans le sous-dossier PlugIns du bundle principal (sinon - corrigez simplement la construction 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)
    }
}

0 votes

Je veux simplement utiliser une image (String, bundle: Bundle?)

0 votes

Ensuite, placez votre Giyuu.png dans le catalogue Assets de Game.bundle.

0voto

user2168735 Points 211

Vous pouvez utiliser mon extension:

extension Image {
    init(path: String) {
        self.init(uiImage: UIImage(named: path)!)
    }
}

En SwiftUI:

Image(path: "Game.bundle/Giyuu.png")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X