6

我正在尝试UIRefreshControl在我的应用程序中实现。我有一个 xib 文件,我UITableViewController在空的 nib 文件中添加了一个,并将刷新属性设置为“启用”。我还向viewDidLoad自定义刷新方法添加了代码。问题是我有一个错误,我找不到任何信息......在我的viewDidLoad我得到“refreshControl在类型的对象上找不到属性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];

}

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

看起来我需要从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.'
4

5 回答 5

11

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

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

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

更新: 更好的方法是添加UITableViewController为 a ChildViewControllerself然后添加tableViewController.tableViewself.view. 你不必做任何黑客来使它以这种方式工作。

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

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

于 2012-10-09T18:25:54.793 回答
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;
于 2012-10-15T07:36:53.130 回答
3

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

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

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

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

于 2013-09-13T15:34:25.893 回答
1

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

于 2012-10-09T18:32:11.610 回答
0

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

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

于 2012-11-13T21:28:33.673 回答