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
添加为self
的ChildViewController
,然后添加tableViewController.tableView
作为self.view
的子视图。您无需进行任何 hack 即可使其以这种方式工作。
[self addChildViewController:tableViewController];
[self.view addSubview:tableViewController.tableView];
您可以相应地为tableView
定义框架。使用这种方法,UIRefreshControl
的工作方式应该与 UITableViewController
的工作方式相同。
`
【讨论】:
这是不受支持的,可能会在未来的 iOS 版本中中断。使用UIRefreshControl
的唯一受支持方式是使用UITableViewController
。
@ACB,这正是我所需要的!!!谢谢百万。我希望我能给你更多的道具!
是的,您可以在 UIViewController 类上使用 UIRefreshControl 并手动添加 UITableView 和 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 问题的主要内容,如果未能解决你的问题,请参考以下文章