質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

736閲覧

録画データの保存完了時にアラートを表示させたい

m-mega

総合スコア56

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/09/02 01:15

カメラで録画したデータを端末のカメラロールに保存するプログラムを作成しました。
データの保存が完了したことをユーザーに知らせるため、保存完了時にアラートを表示させたいと考えています。

###アラート表示用メソッド

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が見つかりませんでした") } }

###不明点
エラーの内容が分からず、アラートが正常に表示できている場合と、そうでない場合との違いが理解できませんでした。
エラー内容の解決方法について教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問