当reloadItems()

时间:2019-02-01 07:13:51

标签: swift uicollectionview overlay reload reloaddata

我已经针对这种行为问了一个问题。我想你明白我的意思,如果不请问。因此,我有一个带有collectionView的演示项目和一个带有整数的数据源。在我的项目中,由于CPU使用率较低,因此必须通过调用reloadItems(at:at:[IndexPath])刷新单元格。但是,当我使用reloadItems(at:at:[IndexPath])刷新单元格时,我可以在毫秒内看到单元格标签中的旧值。看起来并不完美。

这是ViewController.swift中的代码

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return datasource.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let mycell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCell

    mycell.cellvalue.text = String(datasource[indexPath.row])
    return mycell
}


@IBOutlet weak var cellectionview: UICollectionView!
@IBAction func touchButton(_ sender: Any) {
    if datasource[0] == 1 {
        datasource[0] = 3
    } else {
        datasource[0] = 1
    }
    cellectionview.reloadItems(at: [IndexPath(item: 0, section: 0)])
}

var datasource: [Int] = [1, 2, 3, 4, 5, 6]


override func viewDidLoad() {
    super.viewDidLoad()
    cellectionview.dataSource = self
    cellectionview.delegate = self
    // Do any additional setup after loading the view, typically from a nib.
}

}

非常简单。当我触摸按钮时,数据源的第一个值会更改,而我仅对第一个单元格调用重新加载项功能。

那是我的CustomCell的代码:

class MyCell: UICollectionViewCell {
@IBOutlet weak var cellvalue: UILabel!

}

2 个答案:

答案 0 :(得分:1)

使用reloadItems(at: [IndexPath]),CollectionView会使用默认动画FadeInOut自动更新值。您可以通过简单地调用函数func performBatchUpdates(_ updates: (() -> Void)?, completion: ((Bool) -> Void)? = nil)并使用一个动画块并将时间设置为0.0来避免该动画。

UIView.animate(withDuration: 0) {
        self.cellectionview.performBatchUpdates({
            self.cellectionview.reloadItems(at: [IndexPath(item: 0, section: 0)])
        }, completion: nil)
    }

答案 1 :(得分:0)

尝试添加一些动画,例如loading屏幕,这从用户界面的角度来看也更好。

使用MBProgressHUD之类的第三方库可以使您的应用看起来更简洁,有关安装详细信息,请检查link

添加MBProgressHUD后,您的代码看起来就像...

创建一个简单的可恢复功能(在需要时随时调用它)

func needSomeAnimation(msg: String, mode: MBProgressHUDMode){
        let loadingNotification = MBProgressHUD.showAdded(to: self.view, animated: true)
        loadingNotification.mode = mode
        loadingNotification.label.text = msg
        loadingNotification.hide(animated: true, afterDelay: 2.0)
    }

现在称它为您需要的东西。

@IBAction func touchButton(_ sender: Any) {

    needSomeAnimation(msg: "Loading", mode: MBProgressHUDMode.indeterminate)

    if datasource[0] == 1 {
        datasource[0] = 3
    } else {
        datasource[0] = 1
    }
    cellectionview.reloadItems(at: [IndexPath(item: 0, section: 0)])
}

我希望我的解决方案对您有用:D