Общение сторонних делегатов с методами Foundation в swiftUI - PullRequest
0 голосов
/ 23 октября 2019
struct ContentView: View {
    @State private var recordbutton : Bool = false
    @State private var stopbutton : Bool = true
    @State private var recordbuttontext : String = "Tap to record"
    var audioRec = SoundPlayerUIView()
    @State private var presentMe = false
    var body: some View {

            VStack{
                Button(action: {
                    self.stopbutton = !self.stopbutton
                    self.recordbutton = !self.recordbutton
                    self.recordbuttontext = "Recording in progress"
                    self.audioRec.startRecording()
                }){
                    Image("Record")
                }.disabled(recordbutton)


                Text("\(recordbuttontext)")

                Button(action: {
                    self.recordbutton = !self.recordbutton
                    self.stopbutton = !self.stopbutton
                    self.recordbuttontext = "Tap to record"
                    self.audioRec.stopRecording()
                    print(self.presentMe)
                    self.presentMe = true
                }){
                    Image("Stop")    .resizable()
                        .scaledToFit()
                        .frame(width:64,height:64)
                }.disabled(stopbutton)
            }       .alert(isPresented: $audioRecorder.isRecorded) { () -> Alert in
                     Alert(title: Text("Danger"), message: Text("Audio not finished."), primaryButton: .default(Text("Okay"), action: {
                         print("Okay Click")
                     }), secondaryButton: .default(Text("Dismiss")))
        }

}
}

class SoundPlayerUIView: UIView{
 var audioecorder : AVAudioRecorder?
    override init(frame: CGRect) {
        super.init(frame:frame)

    }
    func startRecording(){
        let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true)[0] as String
        let recordingName = "recordedVoice.wav"
        let pathArray = [dirPath,recordingName]
        let filePath : String = pathArray.joined(separator: "/")
        let urlStr : String = filePath.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        let convertedURL : URL = URL(string: urlStr)!
        let session = AVAudioSession.sharedInstance()
        try! session.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
        try! self.audioecorder = AVAudioRecorder(url: convertedURL, settings: [:])
        self.audioecorder!.delegate = self
        self.audioecorder!.isMeteringEnabled = true
        self.audioecorder!.prepareToRecord()
        self.audioecorder!.record()

    }
    required init?(coder: NSCoder) {
        super.init(coder:coder)
    }

    func stopRecording(){
        self.audioecorder?.stop()
        let session = AVAudioSession.sharedInstance()
        try! session.setActive(false, options:AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
    }
    override func layoutSubviews() {
        super.layoutSubviews()
    }
}
extension SoundPlayerUIView: AVAudioRecorderDelegate{
 func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
        if(flag){
        }else{
        }
    }

}

Таким образом, вопрос заключается в представлении делегатов и классов Foundation или uikit, которым не требуется какой-либо компонент представления. Первый вопрос: «Это правильный способ их использования». В этом примере SoundPlayerUIView. Хотя метод делегата работает. Я запутался в использовании параметра flag в AudioRecorderDidFinishRecording для отображения предупреждения пользователю после нажатия кнопки «Стоп». Что необходимо сделать для передачи логического значения из ContentView в SoundPlayerUIView с некоторой привязкой или есть необходимость использовать UIViewRepresentable и координатор - что-то вроде *

...