2016-10-26 4 views
0

반응 형 프로그래밍을 사용하여 Swift에서 최근에 코드 작성이 시작되었습니다. 리 액티브 프로그래밍은 다소 혼란 스럽다. 어쨌든 리 액티브 프로그래밍을 사용하여 확장 및 축소 개념으로 tableview를 구현하고자한다. 내 자신의 방식으로 시도, 정상, 섹션 tableview 및 here 그들은 또한 예제를 제공하기 위해 코드를 작성할 수 있지만 확장 및 축소 tableview 내가 어떤 예제를 찾지 못했습니다. 어느 누구도이를위한 해결책을 제공해 줄 수 있습니까?Swft3 (RxSwift, RxCocoa) - TableView 반응 형 프로그래밍을 사용한 확장 및 축소 개념

+0

표시 할 코드가 있습니까? – user934902

답변

0

나는 "combineLatest"에 익숙하다고 가정합니다. 이 대답은 정말 "깨끗한"가 아니라 어떻게 든 그것을 구현하는 방법의 아이디어를 줄 것이다 : 당신이 알 수없는 경우, 난 단지 내 경우에는이 부분이 있었다

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

:

먼저 배열을 정의 각 섹션을이 사전에 매핑하려면 [Int: Variable<Bool>]을 사용해야하는 섹션 수입니다. 항목이 Observable.combineLatest

expansion(for: _)을 사용하고있는 tableView 위임에 필터링 지금

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

:

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

이제 확장을 얻기위한 방법을 정의 이 구독을와 함께 처리하고 있습니다.이 viewController에서 사용하고있는 것이 아닙니다. view.disposeBag은 매회 prepareForReuse() 번으로 갱신되며 모든 이전 가입자가 삭제되므로 (이러한 메소드를 사용하지 않으면 메모리 누수가 발생하지 않지만 ViewController가 많은 리소스와 물론 원치 않는 동작을 소비하게됩니다)