Недавно начал писать код в Swift с использованием реактивного программирования. Реактивное программирование представляет собой мало запутанную концепцию, так или иначе, я хочу реализовать табличное представление с концепцией расширения и сглаживания с использованием реактивного программирования. Я попытался по-своему, я могу написать код для реализации нормального, section tableview и here, они также представили примеры, но для разворачивания и сворачивания tableview я не нашел никакого примера. Может ли кто-нибудь предложить решение для этого.Swft3 (RxSwift, RxCocoa) - TableView Развернуть и свернуть концепцию с помощью реактивного программирования
ответ
Предполагаете, что вы знакомы с "combLatest". Этот ответ не очень «чистый», но каким-то образом дать представление о том, как осуществить это:
сначала определить массив:
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
}
Уведомление
I распоряжаться этой подпиской view.disposeBag
не тот, который я использую в этом представлении Controller. потому что view.disposeBag
будет обновляться в prepareForReuse()
каждый раз и удалит всех предыдущих подписчиков. (не используя такой метод, не вызовет утечку памяти, но это заставит ViewController потреблять много ресурсов и нежелательного поведения)
у вас есть код для отображения? – user934902