2016-10-26 2 views
0

Недавно начал писать код в Swift с использованием реактивного программирования. Реактивное программирование представляет собой мало запутанную концепцию, так или иначе, я хочу реализовать табличное представление с концепцией расширения и сглаживания с использованием реактивного программирования. Я попытался по-своему, я могу написать код для реализации нормального, section tableview и here, они также представили примеры, но для разворачивания и сворачивания tableview я не нашел никакого примера. Может ли кто-нибудь предложить решение для этого.Swft3 (RxSwift, RxCocoa) - TableView Развернуть и свернуть концепцию с помощью реактивного программирования

+0

у вас есть код для отображения? – user934902

ответ

0

Предполагаете, что вы знакомы с "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 потреблять много ресурсов и нежелательного поведения)