当 tableview 有很多行时,uirefreshcontrol 不显示
uirefreshcontrol not showing when tableview has many rows
我的演示代码非常simple:i想在视图控制器存在时从网络加载,所以我必须从 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),刷新控件将不会显示
这是系统错误吗?还是我使用刷新控件的方式不对?
remove this line
self.tableView.tableFooterView = [[UIView 分配] 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];
}
实际上它显示了 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];
});
});
}
我的演示代码非常simple:i想在视图控制器存在时从网络加载,所以我必须从 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),刷新控件将不会显示
这是系统错误吗?还是我使用刷新控件的方式不对?
remove this line
self.tableView.tableFooterView = [[UIView 分配] 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];
}
实际上它显示了 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];
});
});
}