【问题标题】:Pull to refresh UITableView without UITableViewController在没有 UITableViewController 的情况下拉取刷新 UITableView
【发布时间】:2012-05-04 17:07:27
【问题描述】:

我正在尝试在 UIViewController 内的 UITableView 中实现拉动刷新功能。我不能使用 UITableViewController 因为我希望 UITableView 是视图控制器中的一个较小的子视图,上面还有一些其他的东西。我认为这是可能的,但有人看过它的实现吗?

【问题讨论】:

    标签: ios objective-c iphone uitableview pull-to-refresh


    【解决方案1】:

    我已经用 UIViewController 和一个简单的表格视图实现了 EGORefreshTableHeaderView,诀窍是在 EGO 将滚动视图作为参数的地方,如果您查看表格视图本身继承自滚动视图。

    它只需要这个和一些额外的连接:)

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      直接向UITableView 添加刷新控件而不使用UITableViewController

      override func viewDidLoad() {
          super.viewDidLoad()
          let refreshControl = UIRefreshControl()
          refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)
      
          if #available(iOS 10.0, *) {
              tableView.refreshControl = refreshControl
          } else {
              tableView.backgroundView = refreshControl
          }
      }
      
      @objc func refresh(_ refreshControl: UIRefreshControl) {
          // Do your job, when done:
          refreshControl.endRefreshing()
      }
      

      【讨论】:

      • 优秀而简单。当我在 iOS 7.0.4 上添加到 UIViewController 的表格视图上尝试它时,它对我有用。
      • 有没有人遇到过控件本身不可见但似乎工作正常的问题?
      • 一旦“点击”,表格视图似乎会意外跳下。还不知道为什么。
      • 我发现它需要进入 viewdidappear,不确定这是否是 iOS 7 的功能 - 我还没有在 iOS 8 中测试它...
      • refreshControl 出现在 tableView 的顶部。我通过以下方式解决了这个问题:tableView.insertSubview(refreshControl, atIndex: 0) 而不是 tableView.addSubview(refreshControl)
      【解决方案3】:

      看来,如果您在 viewController 的 loadView 方法中创建 UIRefreshControl,一切正常。 UIRefreshControl 的行为应如此。使用 iOS 7.1 和 iOS 8.2 测试

      【讨论】:

        【解决方案4】:

        @berik 的这个解决方案工作正常,但 UIController 显示在 UITableViewController 的顶部。修复它的方法是进行此更改:

        override func viewDidLoad() {
            let refreshControl = UIRefreshControl()
            refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
            tableView.backgroundView = refreshControl // <- THIS!!!
        }
        
        func refresh(refreshControl: UIRefreshControl) {
            // Do your job, when done:
            refreshControl.endRefreshing()
        }
        

        【讨论】:

        • refreshControl 为我出现在 tableView 的顶部,但您的建议使我的 refreshControl 消失,而不是出现在 tableView 下方。我通过以下方式解决了这个问题: tableView.insertSubview(refreshControl, atIndex: 0) 而不是 tableView.addSubview(refreshControl)
        【解决方案5】:

        Objective-C

        这就是您可以为表格视图实施拉动刷新的方法。 与集合视图的情况相同。只需用集合视图替换表视图分配。

        UITableView *tableViewDemo  =  [[UITableView alloc]init];
        tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
        tableViewDemo.dataSource =  self;
        tableViewDemo.delegate =  self;
        [self.view addSubView: tableViewDemo];
        
        UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
        [refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
        [tableViewDemo addSubview:refreshController];
        
        #pragma mark - Handle Refresh Method
        
        -(void)handleRefresh : (id)sender
        {
           NSLog (@"Pull To Refresh Method Called");
           [refreshController endRefreshing];
        }
        

        【讨论】:

        • 当swift版本>430时,obj-c版本怎么只有9个赞?
        • @ChaseRoberts,那个是2月13号的,看看编辑历史,原来是objective-c的,当时swift是新的,大家都在找swift版本...stackoverflow.com/posts/15010646/revisions
        【解决方案6】:

        我最终使用了ODRefreshControl。 它不需要像上面的 tableView.backgroundView = refreshControl 这样的任何 hack,工作方式几乎相同,并且提供了更好看的 UI。

        【讨论】:

          猜你喜欢
          • 2015-09-04
          • 2021-07-11
          • 1970-01-01
          • 2020-01-14
          • 1970-01-01
          • 2019-04-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多