Skip to main content

MPMediaPickerController - 曲を選択する

設定

swift
let picker = MPMediaPickerController()
picker.allowsPickingMultipleItems = false //
picker.showsCloudItems = false // クラウド

コード例

子画面で MediaPicker を呼んで曲 (MPMediaItem) を取得する例

呼び元

swift
struct ContentView: View {
@State private var showingModal = false
@State private var item: MPMediaItem = MPMediaItem()

var body: some View {
VStack (alignment: .leading) {
Button("show") {
showingModal = true
}
.padding()
}
.padding()
.sheet(isPresented: $showingModal, onDismiss: {
print(item.artist ?? "-")
}) {
MusicPicker(item: $item)
}
}
}

MusicPicker.swift

swift
struct MusicPicker: UIViewControllerRepresentable {
@Binding var item: MPMediaItem

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

func makeUIViewController(context: UIViewControllerRepresentableContext<MusicPicker>) -> MPMediaPickerController {
let picker = MPMediaPickerController()
picker.allowsPickingMultipleItems = false
picker.showsCloudItems = false

// delegate ざっくり言うとイベントが発火された時に呼ばれる処理
picker.delegate = context.coordinator
picker.prompt = "test"
return picker
}

func updateUIViewController(_ uiViewController: MPMediaPickerController, context: Context) {
}

class Coordinator: NSObject, UINavigationControllerDelegate, MPMediaPickerControllerDelegate{
var parent: MusicPicker
init(_ parent: MusicPicker){
self.parent = parent
}

func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
let selectedSongs = mediaItemCollection.items

if selectedSongs.count > 0 {
parent.item = selectedSongs[0]
print(selectedSongs[0].title ?? "-")
print(selectedSongs[0].assetURL ?? "-")
}else{
// parent.song = "not select Music"
}
// 単体指定の場合選択するたびに呼ばれるのでここでpickerを閉じる
mediaPicker.dismiss(animated: true)
}
}

}