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: до тех пор, пока пользователь не удалит свой палец из вытягивания?
Ответы
Ответ 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
.