[英]How to bind table view with multiple sections that represent different data types using RxSwift and RxSwiftDataSources?
I am trying to create a table view with multiple sections using RxSwift. 我正在尝试使用RxSwift创建一个包含多个部分的表视图。 Each section displays data representing a different type.
每个部分显示代表不同类型的数据。
I found the RxSwiftDataSources
library and implemented the example from their documentation. 我找到了
RxSwiftDataSources
库并从他们的文档中实现了这个例子。
Here is a quick runthrough of how that example is implemented: 以下是该示例如何实现的快速问题:
A custom data type CustomData
is defined: 定义了自定义数据类型
CustomData
:
struct CustomData {
var anInt: Int
var aString: String
var aCGPoint: CGPoint
}
Then, the representations for the section are added (note that SectionModelType
is implemented here): 然后,添加该部分的表示(请注意,此处实现了
SectionModelType
):
struct SectionOfCustomData {
var header: String
var items: [Item]
}
extension SectionOfCustomData: SectionModelType {
typealias Item = CustomData
init(original: SectionOfCustomData, items: [Item]) {
self = original
self.items = items
}
}
Finally, some sample data is created and bound to the table view: 最后,创建一些示例数据并将其绑定到表视图:
let sections: [SectionOfCustomData] = [
SectionOfCustomData(header: "First section", items: [CustomData(anInt: 0, aString: "zero", aCGPoint: CGPoint.zero), CustomData(anInt: 1, aString: "one", aCGPoint: CGPoint(x: 1, y: 1)) ]),
SectionOfCustomData(header: "Second section", items: [CustomData(anInt: 2, aString: "two", aCGPoint: CGPoint(x: 2, y: 2)), CustomData(anInt: 3, aString: "three", aCGPoint: CGPoint(x: 3, y: 3)) ])
]
I now want to modify the example and only want to display String
s rather than instances of CustomData
in the second section, so somewhat like this: 我现在想修改示例,只想在第二部分显示
String
而不是CustomData
实例,所以有点像这样:
let sections = [
SectionOfCustomData(header: "First section", items: [CustomData(anInt: 0, aString: "zero", aCGPoint: CGPoint.zero), CustomData(anInt: 1, aString: "one", aCGPoint: CGPoint(x: 1, y: 1)) ]),
SectionOfString(header: "Second section", items: ["a", "b", "c"])
]
This will obviously not compile as sections
now contains elements of different types SectionOfCustomData
an SectionOfString
. 这显然不会编译,因为
sections
现在包含不同类型的元素SectionOfCustomData
和SectionOfString
。 I tried to work around this by trying to declare sections as [SectionModelType]
but this doesn't work, the compiler complains with: 我试图通过尝试将部分声明为
[SectionModelType]
来解决这个问题,但这不起作用,编译器抱怨:
Protocol ' SectionModelType
' can only be used as a generic constraint because it has Self or associated type requirements 协议'
SectionModelType
'只能用作通用约束,因为它具有Self或关联类型要求
You can use enums for wrapping different types. 您可以使用枚举来包装不同类型。
Using enum, SectionOfCustomData definition should be like this: 使用枚举,SectionOfCustomData定义应该是这样的:
enum SectionOfCustomData: SectionModelType {
typealias Item = Row
case customDataSection(header: String, items: [Row])
case stringSection(header: String, items: [Row])
enum Row {
case customData(customData: CustomData) // wrapping CustomData to Row type
case string(string: String) // wrapping String to Row type
}
// followings are not directly related to this topic, but represents how to conform to SectionModelType
var items: [Row] {
switch self {
case .customDataSection(_, let items):
return items
case .stringSection(_, let items):
return items
}
}
public init(original: SectionOfCustomData, items: [Row]) {
switch self {
case .customDataSection(let header, _):
self = .customDataSection(header: header, items: items)
case .stringSection(let header, _):
self = .stringSection(header: header, items: items)
}
}
}
And configureCell looks like this: configureCell看起来像这样:
let dataSource = RxTableViewSectionedReloadDataSource<SectionOfCustomData>()
...
dataSource.configureCell = { [weak self] (dataSource, tableView, indexPath, row) -> UITableViewCell in
switch dataSource[indexPath] {
case .customData(let customData):
let cell: CustomDataCell = // dequeue cell
self?.configure(cell: cell, with: customData)
return cell
case .string(let string):
let cell: StringCell = // dequeue cell
self?.configure(cell: cell, with: string)
return cell
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.