Как определить прокрутку UITableView?

Есть аналогичный вопрос, но ответ очень общий, неопределенный. (Обнаружение прокрутки UITableView) Пожалуйста, не увольняйтесь. Я ищу конкретное решение.

У меня есть UITableView, у которого есть редактируемое текстовое поле, а PickerView появляется, когда выбрана другая ячейка. Мне нужно скрыть firstResponder или PickerView, когда пользователь начнет прокрутку этого UITableView.

До сих пор в вопросе Обнаружение прокрутки UITableView было предложено подклассом UITableView. Если вы подклассифицируете UITableView, то внутренний/закрытый UIScrollView недоступен. Как получить доступ к UITableView родительскому ScrollView (без нарушения закона)?

Спасибо.

Ответ 1

Вам не нужно подклассом UITableView отслеживать прокрутку. Ваш UITableViewDelegate может служить как UIScrollViewDelegate. Поэтому в классе делегата вы можете реализовать -scrollViewWillBeginDragging: или любой другой UIScrollViewDelegate метод, который вам нужен в вашей ситуации. (как на самом деле предлагается в вопросе, который вы упомянули)

Ответ 2

Чтобы расширить ответ на Владимир, вот как я реализовал это решение:

В файле .h:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

В .m файле:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {
    //logic here
}

Ответ 3

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    if (scrollView == myTableView){
       // Your code here.....
    }
}

Ответ 4

У меня была такая же проблема, и у меня были некоторые идеи из ответов выше, чтобы исправить это, но не только сбой приложения, если я хочу обновиться, когда прокручивается представление таблицы, но также он падает, если я прокручиваю его обновляется. Поэтому расширенное решение проблемы при любых обстоятельствах:


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.