简体   繁体   中英

SwiftUI Preview MPMediaItemArtwork

I've got an array based on a structure that includes song title and artist as strings, and its artwork as type MPMediaItemArtwork . To get the preview to work in Swift UI I refer to

struct TrackRow_Previews: PreviewProvider {
    static var previews: some View {
        TrackRow(track: Track(name: "Track 1", artist: "Artist 1", artwork: [MPMediaItemArtwork]))
    }
}

The view works fine when I've commented out the preview, and I've therefore been able to print to the console a selected MPMediaItemArtwork -- which is MPConcreteMediaItemArtwork: 0x281efb890 . But it doesn't accept that either. What value can I put in for the preview artwork to make the preview provider work?

Extra Details:

struct Track: Hashable {
    var name: String
    var artist: String
    var artwork: MPMediaItemArtwork
}

func getTracks(chosenPlaylist: String) {
        trackArray = []
        for playlist in playlists! {
            if (playlist.value(forProperty: MPMediaPlaylistPropertyName)as! String) == chosenPlaylist {
                let songs = playlist.items
                            for song in songs {
                                if song.artwork != nil {
                                trackArray.append(Track(name: (song.value(forProperty: MPMediaItemPropertyTitle) as! String), artist:(song.value(forProperty: MPMediaItemPropertyArtist) as! String), artwork: song.artwork!))
                                }
                            }
                sortArray()
            }
        }
    }

My issue was that I hadn't imported MediaPlayer, as I hadn't needed it for the view, but obviously did for preview view. The code that works is as follows:

struct TrackRow_Previews: PreviewProvider {
    static var previews: some View {
        TrackRow(track: Track(name: "Track 1", artist: "Artist 1", artwork:MPMediaItemArtwork(image: UIImage(imageLiteralResourceName: "Artwork"))))
    }
}

I'm going to assume artwork is an array of MPMediaItemArtwork so for the preview I would just grab the first item in the array like the following:

struct MPMediaItemArtwork {
   var name: String
}

struct Track {
    var name: String
    var artist: String
    var artwork: [MPMediaItemArtwork]
}

struct ContentView_Previews: PreviewProvider {
    static var artwork = MPMediaItemArtwork(name: "0x281efb890")
    static var mediaArray: [MPMediaItemArtwork] = [artwork]

    static var previews: some View {
        TrackRow(track: Track(name: "Track 1", artist: "Artist 1", artwork: [mediaArray[0]]))
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM