更新:解決された問題、以下を参照してください!
状況: nib の UIScrollView に複数の動的にロードされた UIView があります。
予想される動作: UIView のいずれかを 1 回タップすると、タップされたことを示すために背景色が変わります。すでにタップされている場合は、最初の外観に戻るはずです。
各 UIView に UITapGesture レコグナイザーを設定しました。動作を実行しているセレクター メソッドを次に示します。私は自分自身を混乱させました。ここで大ざっぱなロジックをお詫びします (ラフ ドラフトです)。ファイルの init で、最初に「NO」に設定された isTapped BOOL を設定しました。
- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
isTapped = !isTapped;
UIView *v = gestureRecognizer.view;
NSInteger currentIndex = [studentCellArray indexOfObjectIdenticalTo:v];
if (oldIndex != currentIndex) {
isTapped = YES;
}
//check to see if obj in array then switch on/off
if ([tappedViewArray indexOfObjectIdenticalTo:v] != NSNotFound) {
oldIndex = currentIndex;
}
if (currentIndex == v.tag) {
isTapped = !isTapped;
}
if (isTapped) {
[tappedViewArray addObject:v];
[super formatViewTouchedNiceGrey:v];
}else{
[tappedViewArray removeObject:v];
[super formatViewBorder:v];
}
if (currentIndex == oldIndex) {
isTapped = !isTapped;
}
}
実際の動作: 最初の UIView をタップすると、正常に選択されて変更されます。2 回目のタップで元に戻りますが、連続してタップすると選択されたままになります。また、UIView を選択して別のビューに移動する場合は、連続するビューをダブルタップする必要があります。
スクロールビューのUIViewのいずれかをオフまたはオンにするには、1回タップするだけです。
更新: さて、この問題に焦点を合わせようとするいくつかの手書きや他の無駄な試みの後 ---- 私はこの方法で解決し、適切に動作しました!
ここに私の解決策があります:
- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
isTapped = !isTapped;
UIView *v = gestureRecognizer.view;
NSInteger currentIndex = [studentCellArray indexOfObjectIdenticalTo:v];
if (((isTapped && currentIndex != oldIndex) || (!isTapped && currentIndex != oldIndex)) && [tappedViewArray indexOfObject:v] == NSNotFound) {
oldIndex = currentIndex;
[tappedViewArray addObject:v];
[super formatCornerRadiusWithGreyBackgrnd:v];
} else {
[super formatViewBorder:v];
[tappedViewArray removeObject:v];
}
}
だから私はこれがこの問題で誰かを助けることを願っています.
重要なのは、isTapped とインデックスが等しくないこと、およびビュー オブジェクトが、タッチ/タップされたアイテムを示すために組み立てていた配列にないことを確認することでした....