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

时间:2016-03-08 07:10:13

标签: ios uitableview uirefreshcontrol

我的演示代码非常简单:我希望在视图控制器存在时从网络加载,所以我必须从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),那么每件事情都会顺利进行 enter image description here

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

enter image description here

是系统错误吗?或者我使用刷新控制的方式是错误的?

2 个答案:

答案 0 :(得分: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];
        });
    });
}

答案 1 :(得分:0)

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];
}