RxDataSources를 사용하다보면 여러개의 색션 여러타입의 오브젝트를 사용해야할 필요가 있었는데 그때마다 조금씩 햇갈리는게 있어
이번에 정식 RxSwift 예제로 공부를 다시해볼려고한다.
static func dataSource() -> RxTableViewSectionedReloadDataSource<MultipleSectionModel> {
return RxTableViewSectionedReloadDataSource<MultipleSectionModel>(
configureCell: { dataSource, table, idxPath, _ in
switch dataSource[idxPath] {
case let .ImageSectionItem(image, title):
let cell: ImageTitleTableViewCell = table.dequeueReusableCell(forIndexPath: idxPath)
cell.configure(image: image, title: title)
return cell
case let .StepperSectionItem(title):
let cell: TitleSteperTableViewCell = table.dequeueReusableCell(forIndexPath: idxPath)
cell.configure(title: title)
return cell
case let .ToggleableSectionItem(title, enabled):
let cell: TitleSwitchTableViewCell = table.dequeueReusableCell(forIndexPath: idxPath)
cell.configure(title: title, isEnabled: enabled)
return cell
}
},
titleForHeaderInSection: { dataSource, index in
let section = dataSource[index]
return section.title
}
)
}
enum MultipleSectionModel {
case ImageProvidableSection(title: String, items: [SectionItem])
case ToggleableSection(title: String, items: [SectionItem])
case StepperableSection(title: String, items: [SectionItem])
}
enum SectionItem {
case ImageSectionItem(image: UIImage, title: String)
case ToggleableSectionItem(title: String, enabled: Bool)
case StepperSectionItem(title: String)
}
extension MultipleSectionModel: SectionModelType {
typealias Item = SectionItem
var items: [SectionItem] {
switch self {
case .ImageProvidableSection(title: _, items: let items):
return items.map { $0 }
case .StepperableSection(title: _, items: let items):
return items.map { $0 }
case .ToggleableSection(title: _, items: let items):
return items.map { $0 }
}
}
init(original: MultipleSectionModel, items: [Item]) {
switch original {
case let .ImageProvidableSection(title: title, items: _):
self = .ImageProvidableSection(title: title, items: items)
case let .StepperableSection(title, _):
self = .StepperableSection(title: title, items: items)
case let .ToggleableSection(title, _):
self = .ToggleableSection(title: title, items: items)
}
}
}
extension MultipleSectionModel {
var title: String {
switch self {
case .ImageProvidableSection(title: let title, items: _):
return title
case .StepperableSection(title: let title, items: _):
return title
case .ToggleableSection(title: let title, items: _):
return title
}
}
}
RxTableViewSectionedReloadDataSource<MultipleSectionModel> 를 이용하여 DataSource를 만들어주고
안에있는 데이터 타입을 어떻게 넣는지가 중요한데 우선 RxDataSource를 사용하기 위해
여러개의 색션을 받을 수 있는 MultipleSectionModel을 enum으로 만들어준다
RxDataSource에서 사용하기위해 MultipleSectionModel에 SectionModelType 적용하고 내가 원하는 아이템의 형식을
SectionItem에 넣어 준후 RxDataSource에서 색션에 맞춰 셀 처리를 해주면 간단하게 끝
그리고 기존의 RxDataSource와 동일한 방식으로 처리해주면 끝
여기서 조금 주의해야할점이 데이터를 접근하는 방법인데 공부를 하기전에는
switch 문이아닌 if else 문으로 접근을 해서 item에 접근을 할 수 없었다. 그래서 SectionItem에 함수를 만들어서 데이터를 리턴했었는데 switch 문으로 접근하면 바로 데이터에 접근이 가능하니 이 점을 주의하면 될 것 같다.
'Swift 공부' 카테고리의 다른 글
Property Wrapper (0) | 2022.04.12 |
---|---|
RxMoya를 직접 만들어서 사용해보자 (0) | 2022.04.08 |
Swift Throw Error Handling (0) | 2022.04.07 |
Async / await의 도입 스위프트 5.5 (0) | 2022.04.05 |
Swift WMO (0) | 2022.04.04 |