首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxDataSources单元重新加载动画不能正常工作

RxDataSources单元重新加载动画不能正常工作
EN

Stack Overflow用户
提问于 2020-01-13 10:50:28
回答 1查看 3.2K关注 0票数 0

我对RxDataSources单元重新加载RxSwift动画有一些问题。我有一个简单的表设置如下:

代码语言:javascript
复制
import UIKit
import RxDataSources
import RxCocoa
import RxSwift
import Fakery

class ViewController1: UIViewController {


    @IBOutlet weak var tableView: UITableView!
    let bag = DisposeBag()



    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        tableView.register(UINib(nibName: "TestTableViewCell", bundle: nil), forCellReuseIdentifier: "cell")

        let dataSource = RxTableViewSectionedAnimatedDataSource<SectionOfTestData>(
            animationConfiguration: AnimationConfiguration(insertAnimation: .none, reloadAnimation: .none, deleteAnimation: .none),
            configureCell: { dataSource, tableView, indexPath, element in
                let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TestTableViewCell
                cell.testData = element
                return cell
            })

        someData
            .bind(to: tableView.rx.items(dataSource: dataSource))
            .disposed(by: bag)
    }

    let someData = BehaviorRelay<[SectionOfTestData]>(value: [SectionOfTestData(items: [
        TestData(color: .red, name: "Henry"),
        TestData(color: .blue, name: "Josh")
    ])])

    @IBAction func didTapUpdateButton(_ sender: Any) {
        let colors: [UIColor] = [.blue, .purple, .orange, .red, .brown]


        let items = someData.value.first!.items

        // Add random data when button is tapped
        someData.accept([SectionOfTestData(items: items + [TestData(color: colors.randomElement()!, name: Faker().name.firstName())])])
    }

}

模型:

代码语言:javascript
复制
struct TestData {
    let color: UIColor
    let name: String
}

extension TestData: IdentifiableType, Equatable {
    typealias Identity = Int

    var identity: Identity {
           return Int.random(in: 0..<20000)
    }
}

struct SectionOfTestData {
    var items: [Item]

    var identity: Int {
        return 0
    }
}

extension SectionOfTestData: AnimatableSectionModelType {
    typealias Identity = Int
    typealias Item = TestData

    // Implement default init
    init(original: SectionOfTestData, items: [Item]) {
        self = original
        self.items = items
    }
}

class TestTableViewCell: UITableViewCell {

    @IBOutlet weak var colorView: UIView!
    @IBOutlet weak var nameLabel: UILabel!

    var testData: TestData! {
        didSet {
            colorView.backgroundColor = testData.color
            nameLabel.text = testData.name
        }
    }

}

当点击按钮时,BehaviorRelay会被更新,表似乎会刷新,但是“动画”总是一样的。在所提供的代码中,我实际上已经将所有动画类型设置为.none,但它仍然在执行动画。如果我再次尝试将动画类型更改为另一种类型,如.bottom,则动画是相同的。我在这里做错什么了?

这是重新加载动画还是插入动画?我不知道在更新数据时表是否重新加载或插入,我在文档中找不到任何信息。任何关于这方面的指示都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-13 12:48:12

你的问题是:

代码语言:javascript
复制
var identity: Identity {
    return Int.random(in: 0..<20000)
}

RxDataSources使用标识值来计算变更集。您实现它的方式实际上是每次返回一个新值(除非遇到冲突),因此从框架的角度来看,您总是要删除所有项并添加新项。您可以通过实现

代码语言:javascript
复制
decideViewTransition: { _, _, changeset in
    print(changeset)
    return .animated
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59715153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档