6

我正在测试网站的可用性并在本机应用程序中使用 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. before the recorder function”)之外,什么也没有发生。我没有得到其他日志语句,按钮也没有切换它们的启用状态。

我知道 IBAction 是由于命中语句而连接的,但不知道为什么我不能让 stopRecordingWithHandler 触发。

我正在运行 iOS 9.3 的 iPad Pro 9.7" 上对此进行测试。

我开始怀疑它是否与尝试记录 WKWebView 有任何关系,但我会想象如果这是问题所在,我会收到错误消息。

任何帮助将不胜感激 :)

4

1 回答 1

1

我怀疑如果您要在guard语句内的任何位置(在 内stopRecordingCompletionHandler)设置断点,它不会使您的程序崩溃或进入调试器,因为else您的语句的子句guard永远不会被调用。

事实上,这是预期的行为。我们不会期望该else子句执行,除非任一控制器等于nil,因此不能绑定到常量previewControllererror存在,因此不等于nil

使用guard时,调用子句的唯一方法else是指定条件成立。startRecordingWithMicrophoneEnabled正在调用闭包中的 print 语句,因为它位于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,并转义到else子句,该子句必须使用关键字如return.
  • 如果controller不是nil并且我们的常量已经创建,那么我们将继续检查我们的where子句。
  • 如果where评估为true(所以如果没有错误),我们将通过测试并完成该guard语句。else永远不会被执行。
  • 如果where计算结果为false,我们将执行该else块,并且不会调用该语句之后的任何内容。guard
于 2016-05-04T00:50:31.327 回答