ios 如何在从刷新控件释放触摸后执行刷新操作?

oprakyz7  于 2023-05-02  发布在  iOS
关注(0)|答案(3)|浏览(142)

我正在UITableView上实现UIRefreshControl以刷新表的数据。在其他拉取刷新实现方式中,刷新过程直到用户的手指在拉取的刷新距离中被抬起才开始。UIRefreshControl看起来并不像它有这种自定义。
我的UIRefreshControl init代码:

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

我的refresh:代码是相当基本的:

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

如何延迟refresh:功能,直到用户将手指从拉拽中移开?

gzszwxb4

gzszwxb41#

我也遇到了同样的问题。我不认为我的方法是很好的,但似乎它的工作。
1.初始化UIRefreshControl

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
self.refreshControl = refreshControl;

1.当用户完成拖动表格时,检查UIRefreshControl的状态(UITableViewDelegate符合UIScrollViewDelegate

- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{    
    if( self.refreshControl.isRefreshing )
        [self refresh];
}

1.更新表

- (void)refresh
{
    [self.refreshControl endRefreshing];

    // TODO: Update here your items

    [self.tableView reloadData];
}

希望对你有帮助。

fumotvh3

fumotvh32#

UIRefreshControl已经为在“正确”的时间启动提供了便利。拖动刷新控件的正确行为是在用户超过某个“足够远”的阈值后开始刷新,而不是在用户释放拖动时。
为了实现这一点,你需要修改你的-refresh:方法来检查控件何时转换到refreshing状态:

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

请注意,为(... refresh code ...)调用的任何方法都应该是异步的,这样UI就不会冻结。你应该切换到main queue,并在(... refresh code ...)块的末尾调用-endRefreshing,而不是在-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不是旨在与之直接交互的UI组件。用户永远不会 * 触摸 * UIRefreshControl,因此不会触发UIControlEventTouchUpInside事件。

voase2hg

voase2hg3#

使用NSRunLoop可以实现仅在手指抬起时进行刷新。在数组中使用NSRunLoopDefaultMode调用-(void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block;
当触摸仍然保持时,运行循环模式为UITrackingRunLoopMode,它只会在抬离后回到默认值。

相关问题