DataSource
DataSource 是一个简洁且与 UI 无关的协议,用于表示数据源。它可以直接使用,但也可以在需要任何定制时提供极大的灵活性。
在核心上,DataSource 是一个简单的协议。它需要一个 ItemType,表示包含对象的类型。
public protocol DataSource {
associatedtype ItemType
var reloadBlock: ReloadBlock? { get set }
var numberOfSections: Int { get }
func numberOfItems(in section: Int) -> Int
func item(at indexPath: IndexPath) -> ItemType?
func indexPath(after indexPath: IndexPath) -> IndexPath?
}它使用闭包,ReloadBlock,来传递支持数据的 ChangeSet。
public typealias ReloadBlock = (ChangeSet) -> VoidChangeSet 是对相关 UI 元素(例如 UITableView 或 UICollectionView)执行的一组 Change 操作。
public enum ChangeSet {
case some([Change])
case all
}
public enum Change {
case section(type: ChangeType)
case object(type: ChangeType)
}
public enum ChangeType {
case insert(IndexPath)
case delete(IndexPath)
case move(IndexPath, IndexPath)
case update(IndexPath)
}ListDataSource
ListDataSource 继承自 DataSource 并表示由数组支持的单一部分。
public protocol ListDataSource: DataSource {
var items: [ItemType] { get }
}它包括以下默认实现:
var numberOfSections: Intfunc numberOfItems(in section: Int) -> Intfunc item(at indexPath: IndexPath) -> ItemType?func indexPath(after indexPath: IndexPath) -> IndexPath?
示例
class SimpleDataSource: ListDataSource {
typealias ItemType = String
var items = [
"Item 0",
"Item 1",
"Item 2"
]
var reloadBlock: ReloadBlock?
}分区数据源
分区数据源 继承自 数据源,表示由多个分区组成,每个分区由一个 分区 支持。
public protocol SectionedDataSource: DataSource {
associatedtype SectionType: Section<ItemType>
var sections: [SectionType] { get }
func section(at index: Int) -> SectionType?
func headerTitle(for section: Int) -> String?
func footerTitle(for section: Int) -> String?
}它包括以下默认实现:
var numberOfSections: Intfunc numberOfItems(in section: Int) -> Intfunc item(at indexPath: IndexPath) -> ItemType?func indexPath(after indexPath: IndexPath) -> IndexPath?func section(at index: Int) -> SectionType?func headerTitle(for section: Int) -> String?func footerTitle(for section: Int) -> String?
示例
class SimpleDataSource: SectionedDataSource {
typealias ItemType = String
typealias SectionType = Section<String>
var sections = [
Section(items: ["Item 0.0", "Item 0.1", "Item 0.2"]),
Section(items: ["Item 1.0", "Item 1.1"], headerTitle: "Header 1"),
Section(items: ["Item 2.0"], headerTitle: "Header 2", footerTitle: "Footer 2")
]
var reloadBlock: ReloadBlock?
}分区
分区 对象代表一个单独的分区。它包括一个 项目类型 项的数组,以及可选的头部或尾部标题。如果需要任何其他功能,它是可继承的。
open class Section<ItemType> {
public var items: [ItemType]
public var headerTitle: String?
public var footerTitle: String?
public init(items: [ItemType], headerTitle: String? = nil, footerTitle: String? = nil) {
self.items = items
self.headerTitle = headerTitle
self.footerTitle = footerTitle
}
}获取数据源
获取数据源 继承自 数据源,表示一个由 NSFetchResultsController 支持的列表。
public protocol FetchedDataSource: DataSource {
associatedtype ItemType: NSFetchRequestResult
var fetchedResultsController: NSFetchedResultsController<ItemType> { get }
}它包括以下默认实现:
var numberOfSections: Intfunc numberOfItems(in section: Int) -> Intfunc item(at indexPath: IndexPath) -> ItemType?func indexPath(after indexPath: IndexPath) -> IndexPath?
要求
数据源需要 Swift 5.0 和 iOS 8.3+
安装
数据源可以通过 CocoaPods 获得。要安装它,只需将以下行添加到您的 Podfile 中
pod "EZDataSource"作者
Brad Smith
维护者
ezCater 移动团队,[email protected]
许可
数据源可在MIT许可下获得。有关更多信息,请参阅LICENSE文件。