我正在测试网站的可用性,并在本机应用中使用WKWebView。这样做的原因是我可以使用COSTouchVisualizer来显示触摸,而RPScreenRecorder则可以使用麦克风记录交互和“大声说话”。
我有以下IBAction开始录音:
@IBAction func startRecordSession(sender: AnyObject) {
let recorder = RPScreenRecorder.sharedRecorder()
guard recorder.available else{
print("Cannot record the screen")
return
}
recorder.delegate = self
recorder.startRecordingWithMicrophoneEnabled(true) { (err) in
guard err == nil else{
if err!.code ==
RPRecordingErrorCode.UserDeclined.rawValue{
print("User declined app recording")
}
else if err!.code ==
RPRecordingErrorCode.InsufficientStorage.rawValue{
print("Not enough storage to start recording")
}
else{
print("Error happened = \(err!)")
}
return
}
print("Successfully started recording")
self.recordBtn.enabled = false
self.stopRecordBtn.enabled = true
}
}
这似乎适用于打印成功开始录制。
但是,当按下连接到IBAction以停止录制的按钮时,应运行以下代码:
@IBAction func stop() {
let recorder = RPScreenRecorder.sharedRecorder()
print("1. before the recorder function")// This prints
recorder.stopRecordingWithHandler{controller, err in
guard let previewController = controller where err == nil else {
self.recordBtn.enabled = true
self.stopRecordBtn.enabled = false
print("2. Failed to stop recording")// This does not prints
return
}
previewController.previewControllerDelegate = self
self.presentViewController(previewController, animated: true,
completion: nil)
}
}
但是除了打印出第一个日志(“1.录音机功能之前”)之外没有任何反应。我没有获得其他日志语句,也没有按钮切换其启用状态。
我知道IBAction因为命中声明而连接,但不知道为什么我无法触发stopRecordingWithHandler。
我正在运行iOS 9.3的iPad Pro 9.7上进行测试。
我开始怀疑它是否与尝试录制WKWebView有关,但是如果这是问题,我会想到会出错。
非常感谢任何帮助:)
答案 0 :(得分:1)
我怀疑如果你要在guard
语句(stopRecordingCompletionHandler
内)的任何位置设置断点,它不会使程序崩溃或进入调试器,因为else
条款是永远不会调用你的guard
语句。
事实上,这是预期的行为。我们不希望执行else
子句,除非任何一个控制器等于nil
,因此不能绑定到常量previewController
或error
,因此不等于{ {1}}。
使用nil
时,调用guard
子句的唯一方法是指定条件为 NOT 为true。正在调用else
闭包中的print语句,因为它位于startRecordingWithMicrophoneEnabled
语句之外。
所以你只需要从guard
子句中移出一些逻辑。你仍然希望在那里处理错误。
else
因此,为了确保我们明确了recorder.stopRecordingWithHandler{controller, err in
guard let previewController = controller where err == nil else {
print("2. Failed to stop recording with error \(err!)") // This prints if there was an error
return
}
}
self.recordBtn.enabled = true
self.stopRecordBtn.enabled = false
previewController.previewControllerDelegate = self
self.presentViewController(previewController, animated: true,
completion: nil)
print("stopped recording!")
语法,它是:
guard
在您的示例中,您将guard <condition> else {
<statements to execute if <condition> is not true>
}
与可选绑定和guard
子句合并,以创建以下情况:
where
不是controller
,则会绑定到名为nil
的常量。previewController
,那么我们停止评估,永远不要创建常量nil
,并转义到previewController
子句,该子句必须使用{{1}之类的关键字来转移控制}。else
不是return
而我们的常量已经创建,那么我们将继续检查我们的controller
条款。nil
评估为where
(如果没有错误),我们将通过测试并完成where
语句。 true
永远不会被执行。 guard
评估为else
,我们将执行where
阻止,并且在false
语句不会被调用之后执行任何操作。 < / LI>