UIRefreshControl问题

6

我正在尝试在我的应用程序中实现 UIRefreshControl。 我有一个 xib 文件,并在空的 nib 文件中添加了一个 UITableViewController,并将刷新属性设置为“启用”。 同时,我已经在 viewDidLoad 中添加了代码和自定义刷新方法。 问题是我有一个错误,找不到任何信息.... 在我的 viewDidLoad 中,我得到了“Property 'refreshControl' not found on object of type ViewController”。


- (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.'
5个回答

11
你可以将 UIRefreshControl 添加为你的 UITableView 的子视图。
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];

根据Dave的评论,这种方法在iOS的未来版本中可能会失效。因此,在使用时请小心,并尝试向苹果提出错误报告

更新: 更好的方法是将UITableViewController作为selfChildViewController,然后将tableViewController.tableView添加为self.view的子视图。这样做无需进行任何 hack 即可实现。

[self addChildViewController:tableViewController];
[self.view addSubview:tableViewController.tableView];
你可以相应地为 tableView 定义框架。采用这种方法,UIRefreshControl 应该以与其在 UITableViewController 中的工作方式相同的方式工作。

3
这是不受支持的,可能会在未来的iOS版本中出现问题。使用UIRefreshControl的唯一受支持的方法是与UITableViewController一起使用。 - Dave DeLong
1
@ACB,这正是我所需要的!!!非常感谢。我希望我能给你更多的赞扬! - brianhevans
1
是的,您可以在UIViewController类上使用带有UITableView和<UITableViewDelegate,UITableViewDataSource>的UIRefreshControl,并手动添加。其他答案的评论可能是正确的(它不符合文档),但这个小技巧适用于iOS6。 - Oscar Salguero
@akaru UIRefreshControl文档中提到:“您可以通过关联的表视图控制器对象将刷新控件链接到表格。” 因此,不支持其他添加UIRefreshControlUITableView的方法。 - Dave DeLong
你应该按照 Narendra Pathai 的回答使用 UITableViewController.refreshControl 属性。像这样手动添加到 UITableView 是危险的,可能会在未来的 iOS 版本中出现问题。 - Samah

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;

这是正确的答案。根据被接受的答案手动将其添加到UITableView中可能会在未来的iOS版本中导致意外行为。 - Samah

3

所有这些都是用复杂的方法来完成简单的事情。

您不需要添加刷新控件或在您的视图控制器中声明一个。添加下拉刷新是一个两步过程。
第一步:在故事板中,转到您的tableViewController,找到“刷新”,然后选择“已启用”。
第二步:将以下代码添加到您的tableViewController.m文件的viewDidLoad中:

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

这就是整个过程,除了在您的“刷新”方法中执行其他操作。当您想要停止刷新时,请调用[self.refreshControl endRefreshing];


谢谢!我有一种感觉,我读的所有教程都过于复杂了。 - Jeremy Brooks

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

我们可以将 UITableViewController 添加为子视图控制器,然后将 tableview 添加为当前视图控制器的 self.view 的子视图,对吗?我只是在想我们是否真的需要子类化? - iDev
@ACB 是的,你可以将 UITableViewController 作为子视图控制器使用。这是一个非常好的方法。 - Dave DeLong
感谢确认。我对你答案中的这句话“ViewController类必须是UITableViewController的子类”感到困惑,因为我们也可以将其添加为子视图。 - iDev
@ACB,这个语句的意思是要在上面的问题的背景下进行解释。 :) - Dave DeLong

0
我建议您为myTableView创建一个单独的UITableViewController子类。然后,通过使用addChildViewController或iOS6 ContainerView将该类添加到原始ViewController中。这样,即使在视图的某个部分,您也可以使用UIRefreshControl。
接受的答案不是官方方式,因此可能会在未来的版本中出现问题,正如评论所说...

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