Come utilizzare il pacchetto in SwiftUI con l'immagine

Aug 18 2020

Ad esempio: ho Bundle nel progetto, si chiama "Game.Bundle"

let b :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
Image("Giyuu",bundle:self.b)

ma il pacchetto non funziona.

come posso usare il pacchetto personalizzato

Risposte

1 Asperi Aug 18 2020 at 23:09

SwiftUI Image(_ , bundle: _)cerca la risorsa immagine nel catalogo delle risorse del pacchetto corrispondente. Nel tuo caso l'immagine è semplicemente incorporata come file normale, quindi devi trovarla e caricarla come file. Imagedi per sé non può farlo, quindi dovrebbe essere costruito con UIImageciò che ha tale possibilità.

Quindi, supponendo che tu Game.bundlesia nella PlugInssottocartella del pacchetto principale (in caso contrario, correggi semplicemente la costruzione del percorso corrispondente di seguito) ecco un possibile approccio.

Testato con 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

Il tuo frammento come fornito sembra fare riferimento bsia a selfun'istanza che a una variabile locale

let b :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
Image("Giyuu",bundle:self.b)

Volevi?

let bundle :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
let image = Image("Giyuu",bundle:bundle)

O rifattorizzato per eliminare gli scarti forzati !con l'aggiunta di alcune analisi dei problemi.

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
}