0

最近开始使用响应式编程在 Swift 中编写代码。反应式编程是一个令人困惑的概念,无论如何我想使用反应式编程来实现带有展开和折叠概念的表格视图。我以自己的方式进行了尝试,我能够编写代码来实现普通的部分 tableview,在这里他们也提供了示例,但是对于展开和折叠 tableview,我没有找到任何示例。任何人都可以为此提供解决方案。

4

1 回答 1

0

我假设您熟悉“combineLatest”。这个答案并不是真的“干净”,但会以某种方式给出如何实现它的想法:

首先定义一个数组:

var expansions = [Variable<Bool>].init(repeating: Variable<Bool>(true), count: 2)

在我的情况下,我只有 2 个部分,如果您有未知数量的部分,则必须使用[Int: Variable<Bool>]将每个部分映射到这本字典中。

现在定义一个获取扩展的方法:

func expansion(for section: Int) -> Variable<Bool> {
    /* if using [Int: Variable<Bool>]
    if expansions[section] == nil {
        expansions[section = Variable<Bool>(false)
    }*/
    return expansions[section]
}

Observable.combineLatest现在使用和过滤您的项目expansion(for: _)

在 tableView 委托中:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // next line just dequeues a UITableViewHeaderFooterView subclass.
    let view = tableView.dequeueReusableHeaderFooter(forSection: section) as ExpandableHeader
    view.titleLabel.text = dataSource[section].model.title
    view.isExpanded = expansions[section].value // just a variable to update header's UI
    view.expandButton.rx.controlEvent(.touchUpInside)
        .bind { [weak self, weak view = view] in
            guard let strongSelf = self else { return }
            strongSelf.expansions[section].value = !strongSelf.expansions[section].value
            view?.isExpanded = strongSelf.expansions[section].value // because dataSource will not reload this view itself unless it gets dequeued.
    }
    .disposed(by: view.disposeBag)
    return view
}

注意

我正在处理这个订阅,view.disposeBag而不是我在这个 viewController 中使用的那个。因为每次view.disposeBag都会更新,并且会删除所有以前的订阅者。prepareForReuse()(不使用这种方法,不会导致内存泄漏,但会导致 ViewController 消耗大量资源,当然还有不受欢迎的行为)

于 2017-05-14T22:24:10.967 回答