UITableViewをサブクラス化し(KRTableViewとして)、4つのタッチベースのメソッド(touchesBegan、touchesEnded、touchesMoved、touchesCancelled)を実装して、タッチベースのイベントがUITableViewで処理されていることを検出できるようにしました。基本的に私が検出する必要があるのは、UITableViewが上下にスクロールしているときです。
ただし、UITableViewをサブクラス化し、上記のメソッドを作成すると、UITableView全体ではなく、UITableViewCell内でスクロールまたは指の動きが発生したときのみ検出されます。
指を次のセルに移動するとすぐに、タッチイベントは何もしません。
これは私がUITableViewをサブクラス化する方法です:
#import "KRTableView.h"
@implementation KRTableView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
NSLog(@"touches began...");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesMoved:touches withEvent:event];
NSLog(@"touchesMoved occured");
}
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent *)event {
[super touchesCancelled:touches withEvent:event];
NSLog(@"touchesCancelled occured");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
NSLog(@"A tap was detected on KRTableView");
}
@end
UITableViewが上下にスクロールしていることを検出するにはどうすればよいですか?
イベントメソッドをインターセプトする必要はありません。 UIScrollViewDelegate
プロトコルのドキュメントを確認し、-scrollViewDidScroll:
または-scrollViewWillBeginDragging:
状況に応じた方法。
以下を追加したいと思います。
UITableView
を使用している場合は、UITableViewDelegate
を既に実装してテーブルにデータを入力している可能性があります。
プロトコルUITableViewDelegateはUIScrollViewDelegateに準拠しているため、必要なことはメソッド-scrollViewWillBeginDragging
および-scrollViewDidScroll
はUITableViewDelegate実装で直接実装され、実装クラスがUITableViewへのデリゲートとして設定されている場合は自動的に呼び出されます。
ドラッグとスクロールだけでなく、テーブル内のクリックもインターセプトする場合は、独自のUITableViewCellを拡張および実装して、そこにあるtouchesBegan:メソッドを使用できます。これらの2つのメソッドを組み合わせることで、ユーザーがUITableViewを操作するときに必要なほとんどのことを実行できるようになります。
それは私の間違いでした。TableViewをリロードする前にメソッドを呼び出そうとしました。次のコードは、この問題の解決に役立ちました。
[mytableview reloadData];
[mytableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:btn.tag-1] atScrollPosition:UITableViewScrollPositionTop animated:YES];