Swft3 (RxSwift, RxCocoa) - TableView 使用响应式编程展开和折叠概念
Posted
技术标签:
【中文标题】Swft3 (RxSwift, RxCocoa) - TableView 使用响应式编程展开和折叠概念【英文标题】:Swft3 (RxSwift, RxCocoa) - TableView Expand and collapse concept using reactive programming 【发布时间】:2016-10-26 06:54:37 【问题描述】:最近开始使用响应式编程在 Swift 中编写代码。反应式编程是一个令人困惑的概念,无论如何我想使用反应式编程来实现带有展开和折叠概念的表格视图。我以自己的方式进行了尝试,我能够编写代码来实现正常的部分 tableview 和 here 他们也提供了示例,但是对于展开和折叠 tableview 我没有找到任何示例。哪位大神可以提供一下解决办法。
【问题讨论】:
你有代码要显示吗? 【参考方案1】:我假设您熟悉“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 消耗大量资源,当然还有不受欢迎的行为)
【讨论】:
以上是关于Swft3 (RxSwift, RxCocoa) - TableView 使用响应式编程展开和折叠概念的主要内容,如果未能解决你的问题,请参考以下文章
处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)
使用 RxSwift 和 RXCocoa 验证按钮单击时的所有文本字段