UIRefreshControl 问题

Posted

技术标签:

【中文标题】UIRefreshControl 问题【英文标题】:UIRefreshControl issues 【发布时间】:2012-10-09 17:11:13 【问题描述】:

我正在尝试在我的应用程序中实现UIRefreshControl。我有一个 xib 文件,我在空的 nib 文件中添加了一个UITableViewController,并将刷新属性设置为“启用”。我还向viewDidLoad 添加了代码和自定义刷新方法。问题是我有一个错误,我在我的viewDidLoad 中找不到任何关于...的信息

- (void)viewDidLoad

[super viewDidLoad];

self.myTableView =
[[UITableView alloc] initWithFrame:self.view.bounds
                           style:UITableViewStyleGrouped];

self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth |
                                  UIViewAutoresizingFlexibleHeight;

self.myTableView.delegate = self;
self.myTableView.dataSource = self;

[self.view addSubview:self.myTableView];

UIRefreshControl *refresh = [[UIRefreshControl alloc] init];

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
[refresh addTarget:self action:@selector(refreshView:) forControlEvents:UIControlEventValueChanged];

self.refreshControl = refresh;



-(void)refreshView:(UIRefreshControl *)refresh 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."];

// custom refresh logic would be placed here...

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM d, h:mm a"];
NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@",
                                [formatter stringFromDate:[NSDate date]]];

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated];
[refresh endRefreshing];


我不知道为什么该属性不可用....我错过了什么?

看起来我需要在我的ViewController.h 文件中从UITableViewController 继承。如果我已经拥有UITableView,我如何从两者继承?如果我将代码从 ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 更改为 ViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>,则会出现错误:

    error: NSInternalInconsistencyException', 
    reason: '-[UITableViewController loadView] loaded the "ViewController_iPhone" nib but didn't get a UITableView.'

【问题讨论】:

【参考方案1】:

您可以将UIRefreshControl 作为子视图添加到您的UITableView

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];

根据 Dave 的评论,这可能会在未来的 ios 版本中中断。所以在使用它时请小心,并尝试为此提出bug report to apple。

更新: 更好的方法是将UITableViewController 添加为selfChildViewController,然后添加tableViewController.tableView 作为self.view 的子视图。您无需进行任何 hack 即可使其以这种方式工作。

[self addChildViewController:tableViewController];
[self.view addSubview:tableViewController.tableView];

您可以相应地为tableView 定义框架。使用这种方法,UIRefreshControl 的工作方式应该与 UITableViewController 的工作方式相同。 `

【讨论】:

这是不受支持的,可能会在未来的 iOS 版本中中断。使用UIRefreshControl 的唯一受支持方式是使用UITableViewController @ACB,这正是我所需要的!!!谢谢百万。我希望我能给你更多的道具! 是的,您可以在 UIViewController 类上使用 UIRefreshControl 并手动添加 UITableView 和 。 cmets 的其他答案可能是正确的(它不与文档一起使用),但这个小技巧适用于 iOS6。 @akaru The UIRefreshControl docs 说:“您通过关联的表视图控制器对象将刷新控件链接到表。”因此,不支持将UIRefreshControl 添加到UITableView 的其他方法。 您应该按照 Narendra Pathai 的回答使用 UITableViewController.refreshControl 属性。像这样手动将其添加到 UITableView 是危险的,并且可能会在未来的 iOS 版本中中断。【参考方案2】:

要记住的事情:

UIRefreshControl 仅适用于UITableViewController,因此您的类应该是UITableViewController 的子类。

UITableViewController 有一个属性refreshControl,你应该分配一个UIRefreshControl 并将其设置为该属性。

例如:

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged];

tableViewController.refreshControl = refreshControl;

【讨论】:

这是正确答案。根据接受的答案手动将其添加到 UITableView 可能会导致未来版本的 iOS 出现意外行为。【参考方案3】:

所有这些都是做简单事情的复杂方法。

你不需要添加一个刷新控件,或者在你的 viewController 中声明一个。添加下拉刷新是一个两步过程。 第 1 步:在情节提要中,转到 tableViewController,然后在显示“刷新”的位置选择“启用”。 第 2 步:将以下代码添加到 tableViewController.m 文件的 viewDidLoad 中:

[self.refreshControl addTarget:self
                            action:@selector(refresh)
                  forControlEvents:UIControlEventValueChanged];

这就是整个过程,除了在你的 -refresh 方法中做一些事情。当您希望它停止刷新时,请致电[self.refreshControl endRefreshing];

【讨论】:

谢谢!我觉得我正在阅读的所有教程都过于复杂。【参考方案4】:

您的ViewController 类必须是UITableViewController 的子类才能访问refreshControl 属性。

【讨论】:

我们可以添加UITableViewController作为子视图控制器,然后添加tableview作为当前视图控制器self.view的子视图,对吧?我只是想知道我们是否真的需要子类化? @ACB 是的,您可以使用UITableViewController 作为子视图控制器。这是一个很好的方法。 感谢您的确认。我对您回答 “ViewController 类必须是 UITableViewController 的子类” 中的这一说法感到困惑,因为我们也可以将其添加为子视图。 @ACB 该声明应在上述问题的上下文中进行解释。 :)【参考方案5】:

我建议你为 myTableView 创建单独的 UITableViewController 子类。 然后使用 addChildviewController 或 iOS6 ContainerView 在原始 ViewController 中添加该类。这样即使在 View 部分,也可以使用 UIRefreshControl。

接受的答案不是官方的方式,所以它可能会在未来的版本中打破,正如评论所说......

【讨论】:

以上是关于UIRefreshControl 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIRefreshControl

完全禁用 UIRefreshControl - iOS

UIRefreshControl 问题

TableView 下的 UIRefreshControl

UIRefreshControl:刷新时 UITableView '卡住'

UIRefreshControl 重复出现