Skip to content

Instantly share code, notes, and snippets.

@kylehughes
Created September 6, 2022 21:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kylehughes/8e8e25cb425acd171758707d4b212a20 to your computer and use it in GitHub Desktop.
Save kylehughes/8e8e25cb425acd171758707d4b212a20 to your computer and use it in GitHub Desktop.
MPMediaPickerController wrapped for SwiftUI
//
// MediaPicker.swift
// Music Triage
//
// Created by Kyle Hughes on 9/6/22.
//
import Foundation
import MediaPlayer
import SwiftUI
struct MediaPicker {
@Binding private var selection: MPMediaItemCollection?
@Environment(\.dismiss) private var dismiss
// MARK: Internal Initialization
init(selection: Binding<MPMediaItemCollection?>) {
_selection = selection
}
}
// MARK: - UIViewControllerRepresentable Extension
extension MediaPicker: UIViewControllerRepresentable {
// MARK: Creating and Updating the View Controller
func makeCoordinator() -> Coordinator {
Coordinator(dismiss: dismiss, selection: $selection)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<MediaPicker>) -> MPMediaPickerController {
let picker = MPMediaPickerController(mediaTypes: [.music])
picker.allowsPickingMultipleItems = true
picker.delegate = context.coordinator
picker.showsItemsWithProtectedAssets = true
return picker
}
func updateUIViewController(
_ uiViewController: MPMediaPickerController,
context: UIViewControllerRepresentableContext<MediaPicker>
) {
// NO-OP
}
}
// MARK: - MediaPicker.Coordinator Definition
extension MediaPicker {
final class Coordinator: NSObject {
private let dismiss: DismissAction
private let selection: Binding<MPMediaItemCollection?>
// MARK: Internal Initialization
init(dismiss: DismissAction, selection: Binding<MPMediaItemCollection?>) {
self.dismiss = dismiss
self.selection = selection
}
}
}
// MARK: - MPMediaPickerControllerDelegate Extension
extension MediaPicker.Coordinator: MPMediaPickerControllerDelegate {
// MARK: Responding to User Actions
func mediaPicker(
_ mediaPicker: MPMediaPickerController,
didPickMediaItems mediaItemCollection: MPMediaItemCollection
) {
selection.wrappedValue = mediaItemCollection
dismiss()
}
func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
dismiss()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment