Подтвердить что ты не робот

UIRefreshControl - Как сделать действие обновления после выхода touch?

Длительный прослушиватель, первый раз вызывающий абонент здесь, при переполнении стека. Будьте осторожны.

Я использую UIRefreshControl в UITableView для обновления данных таблицы. В других реализациях с обновлением до обновления, процесс обновления не начинается до тех пор, пока пользовательский палец не будет поднят, пока он находится на дистанции обновления. UIRefreshControl не сразу кажется, что у него есть эта настройка.

Мой код инициализации UIRefreshControl:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:refreshControl];

Мое обновление: код довольно простой:

-(void)refresh:(id)sender {
(... refresh code ...)
[sender endRefreshing];
}

Как я могу задержать функцию refresh: до тех пор, пока пользователь не удалит свой палец из вытягивания?

4b9b3361

Ответ 1

Я тоже придерживался той же проблемы. Я не думаю, что мой подход очень приятный, но похоже, что он работает.

  • Init UIRefreshControl

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl = refreshControl;
    
  • Проверьте состояние UIRefreshControl, когда пользователь закончит перетаскивание таблицы (UITableViewDelegate соответствует UIScrollViewDelegate)

    - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
    {    
        if( self.refreshControl.isRefreshing )
            [self refresh];
    }
    
  • Обновить таблицу

    - (void)refresh
    {
        [self.refreshControl endRefreshing];
    
        // TODO: Update here your items
    
        [self.tableView reloadData];
    }
    

Надеюсь, это поможет вам.

Ответ 2

UIRefreshControl уже есть номера для начала в "правильное" время. Правильное поведение элемента управления pull-to-refresh заключается в том, чтобы запустить обновление после того, как пользователь пересек некоторый "достаточно высокий" порог, а не когда пользователь выпустил свое перетаскивание.

Чтобы выполнить это, вам нужно изменить свой метод -refresh:, чтобы проверить, когда элемент управления перешел в состояние refreshing:

-(void)refresh:(id)sender {
    UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
    if(refreshControl.refreshing) {
        (... refresh code ...)
    }
}

Обратите внимание, что любой метод, который вы вызываете для (... refresh code ...), должен быть асинхронным, чтобы ваш пользовательский интерфейс не зависал. Вы должны перейти в основную очередь и вызвать -endRefreshing в конце вашего блока (... refresh code ...), а не в конце -refresh::

- (void)refresh:(id)sender {
    __weak UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
    if(refreshControl.refreshing) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            /* (... refresh code ...) */
            dispatch_sync(dispatch_get_main_queue(), ^{
                [refreshControl endRefreshing];
                //reload the table here, too
            });
        });
    }
}

Изменение управляющего события на UIControlEventTouchUpInside не будет работать, потому что UIRefreshControl не является компонентом пользовательского интерфейса, предназначенным для непосредственного взаимодействия. Пользователь никогда не коснется UIRefreshControl, поэтому не может быть вызвано событие UIControlEventTouchUpInside.