【问题标题】:UIRefreshControl issuesUIRefreshControl 问题
【发布时间】: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.'

【问题讨论】:

    标签: iphone objective-c ios uirefreshcontrol


    【解决方案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 添加为selfChildViewController,然后添加tableViewController.tableView 作为self.view 的子视图。您无需进行任何 hack 即可使其以这种方式工作。

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

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

    【讨论】:

    • 这是不受支持的,可能会在未来的 iOS 版本中中断。使用UIRefreshControl 的唯一受支持方式是使用UITableViewController
    • @ACB,这正是我所需要的!!!谢谢百万。我希望我能给你更多的道具!
    • 是的,您可以在 UIViewController 类上使用 UIRefreshControl 并手动添加 UITableView 和 。 cmets 的其他答案可能是正确的(它不与文档一起使用),但这个小技巧适用于 iOS6。
    • @akaru The 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。

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

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 2018-12-07
      • 2013-10-11
      • 1970-01-01
      • 2013-02-20
      • 2014-03-16
      • 2013-06-22
      • 2012-09-22
      • 2012-09-24
      相关资源
      最近更新 更多