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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

0回答

965閲覧

UIkitからSwiftUIに変更させたい。

isekiryu

総合スコア15

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/09/11 07:45

前提・実現したいこと

録音できる機能を探していたところ、UIKitで録音と再生ができました。
この機能を今作っているswiftUIに入れたいと思っています。
どちらも、info.plistにprivacy-Microphone...は入れています。

この画面に、録音と録音したリストを作りたいと思っています。
イメージ説明

この画面を上の写真の中に入れたいと思っています。
イメージ説明

該当のソースコード(UIKIt)

ViewController.swift

1 2 3 4 import UIKit 5 import AVFoundation 6 7 8 class ViewController: UIViewController, AVAudioRecorderDelegate, UITableViewDelegate, UITableViewDataSource { 9 var recordingSession:AVAudioSession! 10 var audioRecorder:AVAudioRecorder! 11 var audioPlayer:AVAudioPlayer! 12 var numberOfRecords:Int = 0 13 @IBOutlet weak var buttonLabel: UIButton! 14 @IBOutlet weak var myTableView: UITableView! 15 @IBAction func record(_ sender: Any) { 16 //Check if we have an active recorder 17 if audioRecorder == nil { 18 numberOfRecords += 1 19 let filename = getDirectory().appendingPathComponent("(numberOfRecords).m4a") 20 let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 12000, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue] 21 // Start recording 録音を始める 22 do { 23 audioRecorder = try AVAudioRecorder(url: filename, settings: settings) 24 audioRecorder.delegate = self 25 audioRecorder.record() 26 buttonLabel.setTitle("stop recordind", for: .normal) } 27 catch 28 { displayAlert(title: "Ups", message: "Recording Failed") } } 29 else { 30 //stoppimg sudio redcording 録音を止める 31 audioRecorder.stop() 32 audioRecorder = nil 33 UserDefaults.standard.set(numberOfRecords, forKey: "myNumber") 34 myTableView.reloadData() 35 buttonLabel.setTitle("Re", for: .normal) }} 36 37 override func viewDidLoad() { 38 super.viewDidLoad() 39 //setting up session 音声の許可の設定 40 recordingSession = AVAudioSession.sharedInstance() 41 if let number:Int = UserDefaults.standard.object(forKey: "myNumber") as? Int { 42 numberOfRecords = number } 43 AVAudioSession.sharedInstance().requestRecordPermission { (hasPermission) in 44 if hasPermission{ print ("ACCEPTED") }}} 45 //Function that gets path to directory 46 func getDirectory() -> URL { 47 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 48 let documentDirectory = paths[0] 49 return documentDirectory } 50 51 //Function that displays an alert 52 func displayAlert(title:String, message:String) 53 { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 54 alert.addAction(UIAlertAction(title: "dismiss", style: .default, handler: nil)) 55 present(alert, animated: true, completion: nil) } 56 57 58 //SETTING UO Table view テーブルの設定 59 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 60 return numberOfRecords 61 } 62 63 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 64 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 65 cell.textLabel?.text = String(indexPath.row + 1) 66 return cell } 67 func tableView(_ tableView: UITableView, didSelectedRowAt indexPath: IndexPath) { 68 let path = getDirectory().appendingPathComponent("(indexPath.row + 1).m4a") 69 do 70 { 71 audioPlayer = try AVAudioPlayer(contentsOf: path) 72 audioPlayer.play() } 73 catch{ }}} 74 75

該当のソース (swiftUI)

import SwiftUI import Speech import AVFoundation struct newTask: View { @State var task: String = "" @State var task2: String = "" @State var time: Date? = Date() @State var category: Int16 = Entity.Category.ImpUrg_1st.rawValue var categories: [Entity.Category] = [.ImpUrg_1st, .ImpNUrg_2nd, .NImpUrg_3rd, .NImpNUrg_4th, .NImpNUrg_5th, .NImpNUrg_6th] @Environment(.managedObjectContext) var viewContext fileprivate func save() { do { try self.viewContext.save() } catch { let nserror = error as NSError fatalError("Unresolved error (nserror), (nserror.userInfo)") } } //enviromentは、 @Environment(.presentationMode) var presentationMode var body: some View { NavigationView { Form { Section(header: Text("内容")) { TextField("内容の入力", text: $task) } Picker(selection: $category, label: Text("種類")) { ForEach(categories, id: .self) { category in HStack { CategoryImage(category) Text(category.toString()) }.tag(category.rawValue) }} Section(header: Text("メモ")) { TextField("メモ", text: $task2)} Section(header: Text("録音")) { Button(action: { self.presentationMode.wrappedValue.dismiss() }) { HStack(alignment: .center) { Image(systemName: "circle.fill") }.foregroundColor(.red) } } }.navigationBarTitle("内容の追加") .navigationBarItems(trailing: Button(action: { Entity.create(in: self.viewContext, category: Entity.Category(rawValue: self.category) ?? .ImpUrg_1st, task: self.task, time: self.time) //task2: self.task self.save() //dismissで画面を閉じる self.presentationMode.wrappedValue.dismiss() }) { Text("保存") Text("キャンセル") } ) } } } struct newTask_Previews: PreviewProvider { static let context = (UIApplication.shared.delegate as! AppDelegate) .persistentContainer.viewContext static var previews: some View { newTask() .environment(.managedObjectContext, context) } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問