0
votes

MmeMediapickercontroller à Swiftui?

Je reconstruisant une de mes applications à Swiftui, mais j'ai frappé un accroc.

Ma question est la suivante .. Mon application est un générateur de test audiovisuel et a actuellement la possibilité de sélectionner une chanson de test de la musique du périphérique de l'utilisateur. Bibliothèque et définissez cette chanson comme chanson de test pour l'application. Les autres tests incluent le haut-parleur gauche, le haut-parleur droit, etc., mais cette fonctionnalité permet à un utilisateur de sélectionner sa propre chanson de test personnalisée à partir de la bibliothèque de leur périphérique, (ou par défaut par défaut à une chanson de test par défaut.) P>

mon application est Actuellement écrit à Swift et utilise le MmeMediapickerController pour sélectionner la chanson et ça fonctionne très bien. Cependant, je passe un temps difficile à faire fonctionner le contrôleur de sélecteur de bibliothèque de musique avec ma reconstruction SWIFTUI. Tout le monde connaît une solution solide d'accéder à la bibliothèque musicale de l'utilisateur à Swiftui? P>

Je continue à rester coincé avec des objets qui ne sont pas conformes au protocole de classe "NsObjectProtocol" qui me conduit à croire qu'il y a une façon plus swiftui-y de faire ce? Ou peut-être que je peux utiliser swiftui pour la plupart de mes applications, mais transition vers un UIView pour la sélection de la chanson? P>

Voici quelques codes qui ne fonctionne pas encore et c'est joli de ... je voudrais tout ce que je pouvais tout ce que je pouvais à Le problème et la planification sur refactoring si je l'ai eu pour travailler. P>

// Important probablement quelques points de plus que ce dont j'ai besoin. P>

import UIKit
import SwiftUI
import AVFoundation
import AVKit
import MediaPlayer



class SongPickerController: UIViewControllerRepresentable, MPMediaPickerControllerDelegate {
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func makeUIViewController(context: Context) -> UIImagePickerController {
        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = context.coordinator
        return imagePickerController
    }
    
    func makePickerController(context: Context) -> MPMediaPickerController {

        var picker = MPMediaPickerController()
        picker = MPMediaPickerController(mediaTypes: .anyAudio)
        //picker.delegate = self
        picker.allowsPickingMultipleItems = false
        picker.showsCloudItems = false
        picker.prompt = NSLocalizedString(Texts.pickerDetail, comment: Texts.pickerComment)
        return picker
    }
           
        func songSelectButtonClicked () {
           picker = MPMediaPickerController(mediaTypes: .anyAudio)
            picker?.delegate = self
            picker?.allowsPickingMultipleItems = false
           picker?.showsCloudItems = false
           picker?.prompt = NSLocalizedString(Texts.pickerDetail, comment: Texts.pickerComment)

            self.present(picker!, animated: false, completion: nil)
    
    
    func updateUIViewController(_ uiViewController: MPMediaPickerController, context: Context) {
    }
    
    class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        var parent: SongPickerController
        
        init(_ imagePickerController: SongPickerController) {
            self.parent = imagePickerController
        }
        
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            picker.dismiss(animated: true, completion: nil)}}}}

struct SongUIView: UIViewController, MPMediaPickerControllerDelegate {

    var picker: MPMediaPickerController?

    func songSelectButtonClicked () {

        picker = MPMediaPickerController(mediaTypes: .anyAudio)
        picker?.delegate = self
        picker?.allowsPickingMultipleItems = false
        picker?.showsCloudItems = false
        picker?.prompt = NSLocalizedString(Texts.pickerDetail, comment: Texts.pickerComment)

        self.present(picker!, animated: false, completion: nil)
    }


    func mediaPicker(_ mediaPicker: MPMediaPickerController,
        didPickMediaItems mediaItemCollection: MPMediaItemCollection){
            let selectedSong = mediaItemCollection.items
            if (selectedSong.count) > 0 {
                let songItem = selectedSong[0]
                let songURL = songItem.value(forProperty: MPMediaItemPropertyAssetURL)
                let saveString = "\(songURL!)"
                let saveTitle = "\(songItem.title!) by \(songItem.artist!)"
                saveDefaultSong(saveString as NSString, title: saveTitle as NSString)
                mediaPicker.dismiss(animated: true, completion: nil)

                ///selectSongButton.setTitle("Custom song assigned!", for: UIControl.State())

            }
    }

    func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
        mediaPicker.dismiss(animated: true, completion: nil)
    }

    func saveDefaultSong (_ name: NSString, title: NSString) {
        UserDefaults.standard.set(name, forKey: "Default Song")
        UserDefaults.standard.set(title, forKey: "Default Song Title")

    }
}


1 commentaires

C'est bien. Je viens de tout faire travailler hier et fini par utiliser une solution très similaire à la vôtre. J'ai fini par passer le MmeMediAtemCollection pour la lecture dans un MPMusicplayerApplicationController.ApplicationQueueClayer.


3 Réponses :


1
votes

uiviewcontrollerrepresentable est la vue SWIFTUI, il faut donc être une structure xxx

mais uiviewietroller est une classe Uikit, une entité héritée doit donc être une classe xxx


2 commentaires

Oui, je suis allé cette voie. Désolé, cela doit provenir d'un code retourné. Je reviendrai sur ce chemin et vous laisserai savoir où je suis coincé.


Ok. Je posterai mon code pour le faire ci-dessous, mais merci de me manger dans la bonne direction. J'ai toujours des problèmes lors de la sélection (je soupçonne en raison d'une question de jeton de musique Apple) mais je suis de nouveau sur la bonne voie! Merci!



1
votes

Après l'utilisateur ASperi m'a nudgé dans la bonne direction, je voulais partager mon code final pour présenter la bibliothèque de musique à Swiftui. Voici la première partie ... xxx

puis pour l'appeler dans ma vue SwiftUi, je déclare un couple @state vars xxx

Et utilisez ce bouton pour présenter le picker multimédia xxx

Remarque: je travaille toujours sur certains problèmes de jeton de musique Apple et la sélection d'une nouvelle chanson de test ne fonctionne pas encore . Mais la partie de la présentation du sélecteur de musique était la question de cette question et qui fonctionne maintenant.


0 commentaires

1
votes

Cette solution repose presque entièrement sur le poste de Dave du 28 juillet. Ce code précédent n'avait pas encore de moyen de choisir la chanson et de la transmettre à une vue. Dans l'exemple ci-dessous, il passe la chanson sélectionnée à un @environmentimentObject, mais il pourrait aussi facilement être utilisé avec un @Binding comme Dave suggère. XXX


0 commentaires