我在使用UITableView的项目中添加了UIRefreshControl的功能。该应用程序通过从Web服务获取条目到tableview来工作。下面是我用来添加UIRefreshControl的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Updating New Entries"];
[refreshControl addTarget:self action:@selector(pullToRefresh) forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
[self pullToRefresh];
}
- (void) pullToRefresh
{
counter = 1;
[self fetchEntriesNew:counter]; // My code for updating table view
[self performSelector:@selector(updateTable) withObject:nil afterDelay:2];
}
- (void)updateTable
{
[self.tableView reloadData];
[self.refreshControl endRefreshing];
}
现在,如果我进行刷新,则会通过添加新条目进行刷新(如果有)并在tableview上显示以下视图:
一切都很有效,除非第一次启动或打开应用程序时,它不会显示我在上面的图像中显示的视图,尽管它会刷新tableview。我希望它每次刷新时都显示刷新控件视图。谁能指出我做错了什么?谢谢!
更新:我添加了[self refreshControl beginRefreshing],现在显示了UIRefreshControl的微调器视图,但它高于tableview的第一个条目。任何人都可以指出如何纠正它吗?
答案 0 :(得分:12)
这个问题让我困惑了一段时间。我发现4英寸的iOS设备没有这个问题,但3.5英寸的设备却没有。
我试图找出第一次刷新控件beginRefreshing本身和我操作拉动手势之间的差异。这是拉动操作。
我在UIRefreshControl上检查了Apple的文档。它说The control does not initiate the refresh operation directly. Instead, it sends the UIControlEventValueChanged event when a refresh operation should occur.
所以我想也许我可以添加一些东西来模拟一个拉动手势来触发refreshControl的显示。
[yourScrollView(or tableView) setContentOffset:CGPointMake(0.0f, -60.0f)
animated:YES];
[yourRefreshControl beginRefreshing];
有效!
PS。 UIRefreshControl也适用于UIScrollView。 [yourScrollView addSubview:yourRefreshControl]
只是有效。
答案 1 :(得分:1)
我会将您的[self pullToRefresh]调用移至viewWillAppear而不是viewDidLoad。
答案 2 :(得分:1)
在你的tableview中添加UIRefreshControl有两件事可以在代码中添加它们
1. [self setRefreshControl:tableRefreshControl];
2. [self.m_TableView addSubview:tableRefreshControl];
如果您的类是UIViewController的子类
,则添加1或2如果您的类是UITableViewController的子类,则尝试替换
self.refreshControl = refreshControl; with 2 line
答案 3 :(得分:0)
:
[refreshControl beginRefresh]
插入代码:
[refreshControl layoutIfNeeded]