Cara Menggunakan Bundel Di SwiftUI dengan Gambar

Aug 18 2020

Misalnya: saya memiliki Bundle dalam proyek, itu disebut "Game.Bundle"

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

tapi Bundle tidak berfungsi.

bagaimana cara menggunakan Bundel kustom

Jawaban

1 Asperi Aug 18 2020 at 23:09

SwiftUI Image(_ , bundle: _)mencari sumber gambar dalam katalog Aset bundel yang sesuai. Dalam kasus Anda, gambar hanya disematkan sebagai file biasa, jadi Anda harus mencari dan memuatnya sebagai file. Imagesendiri tidak bisa melakukan itu, jadi harus dibangun dengan UIImagekemungkinan seperti itu.

Jadi, dengan asumsi Anda Game.bundleberada di PlugInssubfolder dari bundel utama (jika tidak - perbaiki konstruksi jalur yang sesuai di bawah) di sini adalah pendekatan yang mungkin.

Diuji dengan 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

Cuplikan Anda seperti yang diberikan tampaknya merujuk bbaik selfsebagai instance maupun sebagai variabel lokal

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

Apakah Anda ingin?

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

Atau refactored untuk menghilangkan force unwraps !dengan menambahkan beberapa analisis masalah.

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
}