拉动刷新不使用少量细胞

时间:2015-02-23 19:29:57

标签: ios swift uicollectionview

我有一个feed视图控制器(用UICollectionViewController实现) 当我没有足够的单元格来覆盖大厅屏幕高度时,拉动刷新功能无效。 我该如何解决这个问题?

代码:

var refreshControl: UIRefreshControl!

    override func viewDidLoad() {
    super.viewDidLoad()


    self.refreshControl = UIRefreshControl()
    self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
    self.postCollection.addSubview(refreshControl)
}

    func refresh(sender:AnyObject)
{
    getPost()
}

编辑: 通过不工作我的意思是uicollectionview不能被拉下来,动画没有开始。

3 个答案:

答案 0 :(得分:3)

Swift 4

以下将强制集合视图始终反弹,在这种情况下是垂直方向,即使项目未填充整个集合视图高度。

self.collectionView.alwaysBounceVertical = true

答案 1 :(得分:0)

这意味着您很可能不会在getPost()方法中刷新tableview。更新数据后,您需要拨打self.postCollection.reloadData()

你可以发布cellForRowAtIndexPath的代码吗?您也可能无法正确地核算重复使用的细胞。

编辑:我相信我已经解决了

我看到了与你类似的行为,它与自动布局和大小类相关

对我来说,刷新控件出现在右侧,而不是居中:

模拟器:

bad-sim http://derrrick.com/stackoverflow/refreshcontrol/bad-sim.png

对于你,它可能会在屏幕外显示。

注意在查看故事板时会出现这种情况("使用自动布局"以及"使用大小类"会被选中)。

Xcode:

bad-xcode http://derrrick.com/stackoverflow/refreshcontrol/bad-xcode.png

一个解决方案是取消选中"使用自动布局"。您可能需要调整tableview的大小(我必须将其删除并重新添加)。

然后它应该正确显示。

模拟器:

good-sim http://derrrick.com/stackoverflow/refreshcontrol/good-sim.png

Xcode中:

good-xcode http://derrrick.com/stackoverflow/refreshcontrol/good-xcode.png

最后,这是我的代码(虽然缺少刷新方法:)。

类ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet var postCollection: UITableView!
        var myCollection = ["hi", "there", "bob"]
        var refreshControl: UIRefreshControl!

        override func viewDidLoad() {
            super.viewDidLoad()

            if let myTableView = self.postCollection {
                self.postCollection!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
                self.postCollection!.delegate = self
                self.postCollection!.dataSource = self

                self.refreshControl = UIRefreshControl(frame: CGRectMake(0, 0, 40, 40))
                self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
                self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
                self.postCollection.insertSubview(self.refreshControl, atIndex: 0)
            }
        }

         func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
            cell.textLabel?.text = self.myCollection[indexPath.row]
            return cell
        }

        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.myCollection.count
        }
    }

答案 2 :(得分:0)

    override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    self.refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    listview.addSubview(refreshControl)

}
func refresh(sender:AnyObject) {
    // Your code here
    refreshControl.endRefreshing()
}
  

工作正常