Jack Vanderpump
Jack Vanderpump

Reputation: 486

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()
            }
        }
    }

Upvotes: 1

Views: 399

Answers (2)

Jack Vanderpump
Jack Vanderpump

Reputation: 486

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"))))
    }
}

Upvotes: 1

gotnull
gotnull

Reputation: 27224

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]]))
    }
}

Upvotes: 0

Related Questions