【问题标题】:UITableView UIRefreshControl Does Not Show Its View The First TimeUITableView UIRefreshControl 第一次不显示它的视图
【发布时间】:2013-06-16 02:12:39
【问题描述】:

我在使用 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 的第一个条目之上。谁能指出如何纠正它?

【问题讨论】:

标签: ios objective-c uitableview pull-to-refresh uirefreshcontrol


【解决方案1】:

代码前:

[刷新控制开始刷新]

插入代码:

[refreshControl layoutIfNeeded]

【讨论】:

    【解决方案2】:

    这个问题确实困扰了我一段时间。我发现4英寸的iOS设备没有这个问题,但3.5英寸的设备有。

    我试图找出refreshControl第一次开始刷新本身和我操作拉动手势时的区别。这是拉动操作。

    我在 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] 可以正常工作。

    【讨论】:

    • 从你的回答看来你可以解决这个问题。我已经尝试过您的代码,但它对我不起作用。我用这个 [self.tableView setContentOffset:CGPointMake(0.0f, 60.0f) animated:YES]; [self.refreshControl beginRefreshing];
    • 现在表格视图的第一个单元格几乎在导航栏的后面。你能告诉我如何解决它吗?
    • 嗨@AJ112,在我的代码中是-60.0f,而不是60.0f- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated是设置offset的意思,所以这里的offset应该是负数来模拟下拉的手势,如果设置为正数,内容的顶部会在外面窗户。
    • 我添加了 -60 和 60 并尝试添加其他值,但结果完全相同。默认情况下,它位于正常位置,但加载完成后,第一个单元格会移动到导航栏下方。我还需要做些什么来修复它吗?
    • 对于似乎无法以这种方式工作的人:stackoverflow.com/questions/40154014/…
    【解决方案3】:

    有两件事可以在你的 tableview 中添加 UIRefreshControl,它们都没有添加到你的代码中

    1. [self setRefreshControl:tableRefreshControl];
    2. [self.m_TableView addSubview:tableRefreshControl];
    

    如果您的类是 UIViewController 的子类,则添加 1 或 2

    如果你的类是 UITableViewController 的子类,那么尝试替换

    self.refreshControl = refreshControl; with 2 line
    

    【讨论】:

    • 我的类是 UITableViewController 的子类,所以正如你所说,我必须将 self.refreshControl = refreshControl 替换为 [self.tableView addSubview:tableRefreshControl];但是什么是tableRefreshControl?它不承认它,因为它没有声明任何地方,也没有内置的东西。你能更精确一点吗?谢谢!
    【解决方案4】:

    我会将您的 [self pullToRefresh] 调用移至 viewWillAppear 而不是 viewDidLoad。

    【讨论】:

    • 我在 viewWillAppear 中添加了 [self pullToRefresh] 但在输出中没有看到任何差异。我还能做什么?
    • 你能发布一张你看到的不是你想要的结果的图片吗?重新阅读这篇文章,我只是想确保我完全理解了这个问题。
    • 应用程序启动时,TableView 会使用新数据刷新,但微调器不会自行显示。但如果我手动拉动刷新,它就会显示出来。希望能消除任何困惑
    • 哪个微调器?导航栏中的那个还是它下面的那个?
    • 导航栏是我自己以编程方式添加的,所以它总是会显示出来。我说的是 UIRefreshControl 添加的以下一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2014-09-13
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多