我正在尝试在我的应用程序中实现UIRefreshControl
。我有一个xib文件,我在空的nib文件中添加了UITableViewController
,并将refresh属性设置为“enabled”。此外,我已将代码添加到viewDidLoad
和自定义刷新方法。问题是我有一个错误我找不到任何关于......的信息......在viewDidLoad
我得到的“属性'refreshControl
'找不到类型为ViewController
的对象”< / p>
- (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];
}
我不知道为什么这个属性不可用......我错过了什么?
看起来我需要在UITableViewController
文件中继承ViewController.h
。如果我已经有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.'
答案 0 :(得分:11)
您可以将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
添加为ChildViewController
self
,然后添加tableViewController.tableView
作为self.view
的子视图。你不必做任何破解就能让它以这种方式运作。
[self addChildViewController:tableViewController];
[self.view addSubview:tableViewController.tableView];
您可以相应地定义tableView
的框架。使用此方法,UIRefreshControl
的工作方式应与UITableViewController
的工作方式相同。
`
答案 1 :(得分:5)
要记住的事情:
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;
答案 2 :(得分:3)
所有这些都是做一些简单事情的复杂方法。
您不需要添加刷新控件,也不需要在viewController中声明一个。添加pull-to-refresh是一个两步过程
第1步:在你的故事板中,转到你的tableViewController,并在其中显示“Refreshing”,选择“Enabled”。
第2步:在viewDidLoad:
[self.refreshControl addTarget:self
action:@selector(refresh)
forControlEvents:UIControlEventValueChanged];
这是整个过程,除了在你的-refresh方法中做的事情。如果您希望停止刷新,请致电[self.refreshControl endRefreshing];
。
答案 3 :(得分:1)
您的ViewController
类必须是UITableViewController
的子类才能访问refreshControl
属性。
答案 4 :(得分:0)
我建议你为myTableView制作单独的UITableViewController子类。 然后使用addChildviewController或iOS6 ContainerView在原始ViewController中添加该类。这样即使在View的部分,您也可以使用UIRefreshControl。
接受的答案不是正式的方式,所以它可能在未来的发布中打破,因为评论说...