カメラで録画したデータを端末のカメラロールに保存するプログラムを作成しました。
データの保存が完了したことをユーザーに知らせるため、保存完了時にアラートを表示させたいと考えています。
###アラート表示用メソッド
swift
1// 録画完了アラート表示用メソッド 2func recAlert(){ 3 // 録画完了アラートの設定 4 let alert = UIAlertController( 5 title: "動画の保存が完了しました。", 6 message: "", 7 preferredStyle: .alert) 8 // アラートボタンの設定 9 alert.addAction(UIAlertAction(title: "OK", style: .default)) 10 // アラートの表示 11 self.present(alert, animated: true, completion: nil) 12}
###アラートを表示させたいタイミング
録画が完了した際に自動的に呼ばれる以下のメソッド内で、アラートの表示を呼び出そうとしています。
swift
1 // 録画ファイル保存メソッド,録画終了後(stopRecording()実行後)に自動で呼ばれる 2 func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { 3 // Documents ディレクトリの URL 4 let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 5 do { // Documentsディレクトリのファイル一覧の取得に成功 6 let contentUrls = try FileManager.default.contentsOfDirectory(at: documentDirectoryURL, includingPropertiesForKeys: nil) 7 for contentUrl in contentUrls { 8 // mp4ファイルならカメラロールに書き出す 9 if contentUrl.pathExtension == "mp4" { 10 PHPhotoLibrary.shared().performChanges({ 11 PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: contentUrl) 12 }) { (isCompleted, error) in 13 if isCompleted { // フォトライブラリに書き出し成功 14 self.saveCompleted = true; 15 do { 16 // Documentsディレクトリのファイルを削除 17 try FileManager.default.removeItem(atPath: contentUrl.path) 18 print("フォトライブラリ書き出し・ファイル削除成功 : (contentUrl.lastPathComponent)") 19 // アラートを表示 20 self.recAlert() 21 } 22 catch { 23 print("フォトライブラリ書き出し後のファイル削除失敗 : (contentUrl.lastPathComponent)") 24 } 25 } 26 else { 27 print("フォトライブラリ書き出し失敗 : (contentUrl.lastPathComponent)") 28 self.saveCompleted = false; 29 } 30 } 31 } 32 } 33 } 34 catch { 35 print("ファイル一覧取得エラー") 36 } 37 }
#####エラー内容
プレゼンテーションの進行中にアラートを表示しようと試みている。というようなエラーが出ています。
test[4583:1696763] [Presentation] Attempt to present <UIAlertController: 0x10189f000> on <test.ViewController: 0x10101cc00> (from <test.ViewController: 0x10101cc00>) while a presentation is in progress.
###試したこと
他の場所でアラート表示メソッドを呼び出したところ、そこでは正常に表示されることが確認できました。
例)LEDの点灯と消灯を管理するメソッド内でアラートを表示した場合
// LED点灯消灯用メソッド func ledFlash(flg: Bool){ let avDevice = AVCaptureDevice.default(for: AVMediaType.video)! if avDevice.hasTorch { // デバイスにLEDがある場合 do { // デバイスの使用をロックしてアクセスを要求 try avDevice.lockForConfiguration() if (flg){ // LED点灯 avDevice.torchMode = AVCaptureDevice.TorchMode.on recAlert() } else { // LED消灯 avDevice.torchMode = AVCaptureDevice.TorchMode.off } avDevice.unlockForConfiguration() // デバイスの使用をロックしてアクセスを要求 } catch { print("LEDの使用が許可されませんでした") } } else { print("LEDが見つかりませんでした") } }
###不明点
エラーの内容が分からず、アラートが正常に表示できている場合と、そうでない場合との違いが理解できませんでした。
エラー内容の解決方法について教えていただきたいです。
あなたの回答
tips
プレビュー