6

Web サイトのユーザビリティをテストしており、ネイティブ アプリで 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 を記録しようとすることと関係があるのではないかと考え始めていますが、これが問題である場合はエラーが発生すると思います。

どんな助けでも大歓迎です:)

4

1 に答える 1

1

guardステートメント内 ( 内)の任意の場所にブレークポイントを設定した場合、ステートメントの句が呼び出されることはないstopRecordingCompletionHandlerため、プログラムがクラッシュしたり、デバッガーに入ったりすることはないと思います。elseguard

実際、これは予期された動作です。elseコントローラが等しいためnilに定数にバインドできないpreviewControllerか、error存在するために等しくない場合を除き、句が実行されることは期待できません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を実行し、ステートメントの後のものは呼び出されません。elseguard
于 2016-05-04T00:50:31.327 に答える