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") } }
3 Réponses :
mais uiviewcontrollerrepresentable code> est la vue SWIFTUI, il faut donc être une structure
uiviewietroller code> est une classe Uikit, une entité héritée doit donc être une classe p>
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!
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 ... puis pour l'appeler dans ma vue SwiftUi, je déclare un couple @state vars p> Et utilisez ce bouton pour présenter le picker multimédia p> 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. P> p>
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.
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.