UIRefreshControl问题

时间:2012-10-09 17:11:13

标签: iphone objective-c ios uirefreshcontrol

我正在尝试在我的应用程序中实现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.'

5 个答案:

答案 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:

中将以下代码添加到tableViewController.m文件中
[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。

接受的答案不是正式的方式,所以它可能在未来的发布中打破,因为评论说...