当 tableview 有很多行时,uirefreshcontrol 不显示

Posted

技术标签:

【中文标题】当 tableview 有很多行时,uirefreshcontrol 不显示【英文标题】:uirefreshcontrol not showing when tableview has many rows 【发布时间】:2016-03-08 07:10:12 【问题描述】:

我的演示代码非常简单:我想在视图控制器存在时从网络加载,所以我必须从 viewdidload 手动调用 beginRefreshing 以显示开始时的加载 refreshControl

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property(nonatomic,strong) UIRefreshControl* control;
@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

    self.control = [UIRefreshControl new];
    [self.tableView addSubview:self.control];
    [self.tableView reloadData];
    [self.control beginRefreshing];


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.



- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];




- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return 3;


- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell* cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.backgroundColor = [UIColor redColor];
    return cell;

@end

如果我只是将节数设置为 1(总行数为 3),则一切顺利

但如果我将节数更改为更大的数字,例如 10(总行数为 30),刷新控件将不会显示

这是系统错误吗?还是我使用刷新控制的方式不对?

【问题讨论】:

请发布代码而不是代码截图。 @Leo 好的,我已经把代码贴出来了:) 【参考方案1】:

实际上它的显示即使有 10 个部分,每个部分 30 行。 问题是它隐藏在顶部。 试试这个:

self.control = [UIRefreshControl new];
[self.tableView addSubview:self.control];
[self.tableView reloadData];
[self.control beginRefreshing];
[self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top) animated:true];

我不知道你为什么要显示加载初始值。它必须在用户下拉操作时触发。然后你刷新页面数据并重新加载页面。 您还应该考虑添加

-(void)setUpRefreshControl

    self.control = [UIRefreshControl new];
    [self.tableView addSubview:self.control];
    [self.tableView reloadData];
//    [self.control beginRefreshing];
    [self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top) animated:true];
    [ self.control addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];



- (void)refresh 
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
        //Background Thread
        //Do data refresh task here like getting new data for UI.
        sleep(1);
        dispatch_async(dispatch_get_main_queue(), ^(void)
            [self.control endRefreshing];
            [self.tableView reloadData];
        );
    );

【讨论】:

因为在实际代码中,我想在视图控制器存在时从网络加载,所以我希望在开头看到刷新控件,所以我必须手动将内容偏移设置为实现这一目标? 你认为这是某种系统错误吗? 正如我所提到的,你必须改变偏移来实现这一点。因为 UIRefreshControl 和 UITableView 是独立工作的。【参考方案2】:
remove this line

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

然后这样做

self.control  =  [UIRefreshControl new];
[self.tableView addSubview: self.control];
[ self.control addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];

- (void)refresh 
    //refresh your data
    [self.control endRefreshing];
    [self.tableView reloadData];

【讨论】:

想要在视图控制器存在时从网络加载,所以我必须从 viewdidload 手动调用 beginRefreshing

以上是关于当 tableview 有很多行时,uirefreshcontrol 不显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中删除 TableView 中的行时从右到左单元格设置动画

从 tableView.allowsMultipleSelectionDuringEditing = YES 选择行时如何防止蓝色突出显示

拉动刷新默认刷新级别更改

TableView 不显示超过 10 行

UITableView 在插入更多行时滚动到顶部

ios 5子视图在tableview单元格中的两个视图之间翻转