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 и координатор - что-то вроде *