私は自分のUIGestureRecognizerサブクラスを構築して、タップとスワイプのジェスチャを組み合わせ、スワイプの動きの方向を追跡します。この意図されたジェスチャーでは、ユーザーは画面に触れ、指を画面に戻してドラッグする前に、指が画面から1回以上完全に跳ね返るようにします。それはすぐにスワイプが続くタップです。カスタムUIGestureRecognizerでの位置のトラッキング
私はこの認識装置の実際のジェスチャー部分を正しく動作させることができましたが、私が問題を見つけているのは、ユーザーのスワイプが移動した点の軌跡を保存することです。
まず、私は私のカスタム認識クラスのクラスメンバーとしてCGPoint
の配列を初期化
class UITapSwipeGestureRecognizer: UIGestureRecognizer {
...
var trail: [CGPoint] = []
その後、空でない場合touchesBegan(_, with)
に、私が最初の配列をクリアし、への出発点を養います配列
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
...
if !trail.isEmpty { // EXC_BAD_ACCESS error thrown here
trail.removeAll(keepingCapacity: true)
}
trail.append(location(in: view?.window))
...
}
私はtouchesMoved(_, with)
に私の使用状況を議論するために行くだろうが、これは私の問題を引き起こすのに十分です。 !trail.isEmpty
で、アレイにアクセスする最初の試みの際に、私は次のエラーを取得する:
Thread 1 EXC_BAD_ACCESS (code=1, address=0x10)
私はこの配列のスレッドセーフバージョンを作成する必要がありますか?もしそうなら、私はこれをどうやって行うべきですか?あるいは、私はこれだけ完全に間違った方法をとっていますか?
からアクセスする方法を説明しますエラーが発生している場所で機能を表示してください。また、コードのどの行がエラーを生成しているのですか?空のチェック、削除、追加...? – Russell
関数の宣言を含めて、ブロックにもう少しコードを追加しました。このエラーは 'trail'への最初の呼び出しで投げられます。特に'!trail.isEmpty'呼び出しではそうです。 – theodinspire
まあ、それは起こるべきではありません!その行にブレークポイントを設定した場合 'if!trail.isEmpty' - ' trail'はどのように見えますか?あなたは[CGPoint]の0値配列として正しく定義されているはずです。 – Russell