Created
September 6, 2022 21:24
-
-
Save kylehughes/8e8e25cb425acd171758707d4b212a20 to your computer and use it in GitHub Desktop.
MPMediaPickerController wrapped for SwiftUI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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