有一个类似的问题,但答案很笼统,含糊不清。(Detecting UITableView scrolling) 请不要解雇。我正在寻找具体的解决方案。
我有UITableView
,其中包含可编辑的文本字段,当选择了另一个单元格时,会出现PickerView。
我需要的是在用户开始滚动此UITableView
时隐藏firstResponder或PickerView。
到目前为止,问题Detecting UITableView scrolling存在一个你应该继承UITableView
的消息。如果您的子类UITableView
仍然无法访问内部/私有UIScrollView
。
如何访问UITableView
的父ScrollView(不违反法律规定)?
感谢。
答案 0 :(得分:36)
您无需子类UITableView
来跟踪滚动。您的UITableViewDelegate也可以作为UIScrollViewDelegate
。因此,在您的委托类中,您可以在您的情况下实施-scrollViewWillBeginDragging:
或任何UIScrollViewDelegate
方法。 (正如你提到的问题中实际建议的那样)
答案 1 :(得分:8)
为了扩展弗拉基米尔的答案,这就是我实施这个解决方案的方式:
在.h文件中:
@interface MyViewController : UIViewController <UIScrollViewDelegate>
在.m文件中:
- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {
//logic here
}
答案 2 :(得分:6)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if (scrollView == myTableView){
// Your code here.....
}
}
答案 3 :(得分:1)
我遇到了同样的问题,我从上面的答案中得到了一些想法来修复它,但是如果我想在滚动表视图时刷新应用程序崩溃,但是如果我滚动它时它也会崩溃正在焕然一新。因此,在所有情况下解决问题的扩展解决方案是:
1.1。如果用户按下刷新按钮,则禁用滚动
1.2。刷新过程完成后启用滚动
2.1。如果用户正在滚动,请禁用刷新按钮
2.2。用户完成滚动后启用刷新按钮
实现第一部分(1.1。和1.2。):
-(void)startReloading:(id)sender
{
...
self.tableView.userInteractionEnabled = NO;
// and the rest of the method implementation
}
-(void)stopReloading:(id)sender
{
self.tableView.userInteractionEnabled = YES;
// and the rest of the method implementation
}
实施第二部分(2.1。和2.2。):
- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView
{
barButton.enabled = NO;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
barButton.enabled = YES;
}
正如前面的回答中所解释的那样,UISCrollViewDelegate
文件中需要设置.h
:
@interface MyTableViewController : UITableViewController <UIScrollViewDelegate>
P.S。您可以使用scrollEnabled
代替userInteractionEnabled
,但这一切都取决于您正在做什么,但userInteraction是首选选项。