斯威夫特,展开零运行时错误记录音频
问题描述:
在下面的代码我得到一个运行时错误,你可以在这里看到的这张照片:斯威夫特,展开零运行时错误记录音频
后,我登录到Twitter的这种事,Push记录按钮,并在下一个ViewController中按下Record按钮。我怀疑原因是,不知何故audioRecorder是零,当强制解包使用!在“如果self.audioRecorder!.recording”,代码崩溃。但我不明白为什么audioRecorder应该在这里。你们有什么想法我做错了什么? 这里是完整的代码。 最佳,
import UIKit
import AVFoundation
class RecordViewController: UIViewController {
var audioRecorder : AVAudioRecorder?
func setUpAudioRecorder() {
do {
let baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first!
let pathComponents = [baseString, "sound.m4a"]
let audioURL = NSURL.fileURLWithPathComponents(pathComponents)
let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker)
try session.setActive(true)
var recordSettings = [String : AnyObject]()
recordSettings[AVFormatIDKey] = Int(kAudioFormatMPEG4AAC)
recordSettings[AVSampleRateKey] = 44100.0
recordSettings[AVNumberOfChannelsKey] = 2
self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings)
self.audioRecorder!.meteringEnabled = true
self.audioRecorder!.prepareToRecord()
} catch (_) {
}
}
@IBOutlet weak var recordButton: UIButton!
@IBOutlet weak var playButton: UIButton!
@IBOutlet weak var saveButton: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
self.playButton.enabled = false
self.saveButton.enabled = false
}
@IBAction func cancelTapped(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func saveTapped(sender: AnyObject) {
}
@IBAction func recordTapped(button: AnyObject) {
if self.audioRecorder!.recording {
self.audioRecorder!.stop()
button.setTitle("Record", forState: UIControlState.Normal)
} else {
do{
try AVAudioSession.sharedInstance().setActive(true)
self.audioRecorder!.record()
button.setTitle("Stop Recording", forState: UIControlState.Normal)
} catch (_) {}
}
self.playButton.enabled = true
}
@IBAction func playTapped(sender: AnyObject) {
}
}
答
哦,孩子,你是艺术Fistman多么正确。我只是在IBOutlet中调用函数,现在它正在工作。非常感谢您的帮助。 这里是工作的代码别人感兴趣:
import UIKit
import AVFoundation
class RecordViewController: UIViewController {
var audioRecorder : AVAudioRecorder?
func setUpAudioRecorder() {
do {
let baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first!
let pathComponents = [baseString, "sound.m4a"]
let audioURL = NSURL.fileURLWithPathComponents(pathComponents)
let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker)
try session.setActive(true)
var recordSettings = [String : AnyObject]()
recordSettings[AVFormatIDKey] = Int(kAudioFormatMPEG4AAC)
recordSettings[AVSampleRateKey] = 44100.0
recordSettings[AVNumberOfChannelsKey] = 2
self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings)
self.audioRecorder!.meteringEnabled = true
self.audioRecorder!.prepareToRecord()
} catch (_) {
}
}
@IBOutlet weak var recordButton: UIButton!
@IBOutlet weak var playButton: UIButton!
@IBOutlet weak var saveButton: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
self.playButton.enabled = false
self.saveButton.enabled = false
}
@IBAction func cancelTapped(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func saveTapped(sender: AnyObject) {
}
@IBAction func recordTapped(button: AnyObject) {
if (self.audioRecorder?.recording == nil || !self.audioRecorder!.recording) {
if (self.audioRecorder?.recording == nil) {
setUpAudioRecorder()
}
do {
try AVAudioSession.sharedInstance().setActive(true)
self.audioRecorder!.record()
button.setTitle("Stop Recording", forState: UIControlState.Normal)
} catch (_) {}
} else {
self.audioRecorder!.stop()
button.setTitle("Record", forState: UIControlState.Normal)
}
self.playButton.enabled = true
}
@IBAction func playTapped(sender: AnyObject) {
}
}
确定'实际上是被称为'recordTapped'前setUpAudioRecorder'? –