UIRefreshControl没有显示指示器或标题?

4

我希望使用 UIRefreshControl 实现 Pull To Refresh 功能到我的 UITableViewController,以下是我目前尝试的方法。

 - (void)viewDidLoad
    {
     .....
     ////********* Pull to refresh ************/
        UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
        refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
        refresh.tintColor = [UIColor magentaColor];
     //   [self.tableView addSubview:refresh];
// [self.refreshControl setEnabled:YES];
        [refresh addTarget:self action:@selector(pullToRefresh:) forControlEvents:UIControlEventValueChanged];
        self.refreshControl = refresh;

    }
    -(void)pullToRefresh:(UIRefreshControl *)refresh {
         [refresh beginRefreshing];
        refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing.."];
        [self loadRecentActivities];
    }

但是当我拉动表格时,既没有看到活动指示器也没有看到标题,但是 pullToRefresh 已经被调用并且表格已经刷新。我的应用支持 iOS7.0+。 我缺少了什么?非常感谢您的帮助! 编辑: 我已尝试使用 [self.refreshControl setEnabled:YES];[self.refreshControl setEnabled:YES]; 如我编辑后的代码中所述,但还是没有成功。 这是我拉动表格以进行刷新时的样子-enter image description here 最终解决方案: 对于表视图背景,我正在使用...
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
self.tableView.backgroundView = imageView;

刷新指示器和标题被隐藏在 self.tableView.backgroundView 后面,应改用

[self.tableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];

它解决了我的问题。同时非常感谢Balram Tiwari,请查看他的答案,如果您仍然有问题。

那一行在我的代码中被注释了,而且它并没有产生任何影响。 - Bharat
调用[refresh beginRefreshing]在下拉刷新中,这就是全部。当您的任务完成时,调用[refresh endRefreshing]。 - Pawan Rai
这个有区别吗? - Pawan Rai
你是否启用了 [self.refreshControl setEnabled:YES]; - Pawan Rai
1
更好的解决方案在这里回答了,https://dev59.com/WWMk5IYBdhLWcg3w3xhY#18907625。 - TeaCupApp
显示剩余4条评论
2个回答

11
只需在refreshControl的初始化代码下方添加self.tableView.backgroundView.layer.zPosition -= 1;即可。

1
这个解决方案很好用。在我的情况下,背景图片遮挡了UIRefreshControl... - Jonathan F.

7
实际上,你的刷新控制器在tableView中已经存在了,只不过它在导航栏后面。(听起来不同,对吧)这里有个关键点,
当你在iOS7中使用代码时,默认情况下UIViewController将占据整个屏幕(edgesForExtendedLayout)。这意味着你的(0,0)将从左上角开始,在导航栏下面。
所以你的tableView实际上从那儿开始。要摆脱它,只需在viewDidLoad方法中为你的viewController指定edgesForExtendedLayout.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

之后它应该是可见的。

  • 修复之前:

修复之前

  • 修复之后:

修复之后

希望这有所帮助。


还有,只需取消注释此行代码。[self.tableView addSubview:refresh]; - Balram Tiwari
它对我不起作用。我认为这不是由于edgesForExtendedLayout,因为当我的表视图被刷新时,你可以看到有空间(标记为红色矩形)。 - Bharat
我在self.navigationController.view上添加了一个子视图(请参见屏幕截图中的Call/Talk Activity),并尝试将其删除,但无论哪种情况下都无法出现刷新指示器。 - Bharat
那么,问题是什么,Bharat? - Balram Tiwari
edgesForExtendedLayout和constraints。无论如何,你帮了我很多,谢谢。 - Bharat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接