Значение Label внутри ячейки CollectionView перекрывает старое значение в течение миллисекунды, в то время как reloadItems () - PullRequest
0 голосов
/ 01 февраля 2019

Я уже задавал вопрос по этому поведению.Я думаю, вы понимаете, что я имею в виду, если не спросите.Итак, у меня есть небольшой демонстрационный проект с collectionView и источником данных с целыми числами.В моем проекте я должен обновить ячейки, вызвав 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 голосов
/ 03 февраля 2019

При 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)
    }
0 голосов
/ 01 февраля 2019

Попробуйте добавить анимацию, такую ​​как loading, экран также выглядит лучше с точки зрения пользовательского интерфейса.

Используйте сторонние библиотеки, такие как MBProgressHUD, чтобы ваше приложение выглядело чище, подробности установки см. В ссылка пожалуйста.

После добавления 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

...