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