检测UITableView滚动

我已经分类UITableView(作为KRTableView),并实现了四个基于触摸的方法(touchesBegan,touchesEnded,touchesMoved和touchesCancelled),以便我可以检测到基于触摸的事件正在处理UITableView。 基本上我需要检测的是当UITableView向上或向下滚动时。

但是,UITableView的子类化和创build上述方法只会检测UITableViewCell中是否发生滚动或手指移动,而不是整个UITableView。

只要我的手指移动到下一个单元格,触摸事件就不会执行任何操作。

这是我如何inheritanceUITableView:

#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,所以你所要做的就是直接在你的UITableViewDelegate实现中实现-scrollViewWillBeginDragging-scrollViewDidScroll方法,如果实现类被设置为UITableView的委托,它们将被自动调用。

如果你还想拦截你的表中的点击,而不仅仅是拖动和滚动,你可以扩展和实现你自己的UITableViewCell,并使用里面的touchesBegan:方法。 通过组合这两种方法,当用户与UITableView交互时,您应该能够完成大部分所需的操作。

这是我的错误,我试图在重新加载tableview之前调用该方法。 下面的代码帮助我解决了这个问题。

[mytableview reloadData];

[mytableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:btn.tag-1] atScrollPosition:UITableViewScrollPositionTop animated:YES];