枚举表
使用Swift枚举优雅地布局静态表格的方法。
预览
设置视图控制器代码混乱?试试枚举。
像这样枚举您的单元格和行。
由Xcode清晰地绘制轮廓。
同时保持视图控制器清洁。
最终得到的表格。
开始使用
先决条件
Cocoapods
如果还没有安装,请安装cocoapods。然后将其添加到您的podfile中。
pod 'EnumeratedTable', '~> 0.0.6'
Swift包管理器
首先确保您使用的是Xcode 11.0或更高版本。
然后,转到文件 -> Swift包 -> 添加包依赖...
快速教程
首先,考虑此存储库中的Example项目是一个最佳实践。
1. 使您的表格视图控制器符合 TableEnumerated
extension ViewController: TableEnumerated {
// ...
}
2. 列出你的部分
extension ViewController: TableEnumerated {
enum Section: Int, SectionEnumeration {
case user
case setting
}
}
3. 列出每个部分的行
extension ViewController: TableEnumerated {
enum UserRow: Int, RowEnumeration {
case avatar
case biography
var text: String? {
switch self {
case .avatar:
return "iMoe"
case .biography:
return "A developer."
}
}
var reuseIdentifier: String? {
switch self {
case .avatar:
return "Avatar Cell"
case .biography:
return "Cell"
}
}
}
enum RichTextRow: Int, RowEnumeration {
case row1
case row2
var text: String? {
switch self {
case .row1:
return "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
case .row2:
return "Ut enim ad minim veniam."
}
}
var reuseIdentifier: String? {
return "Rich Cell"
}
}
enum Section: Int, SectionEnumeration {
case user
case setting
var RowsInSection: RowEnumerated.Type {
switch self {
case .user:
return ViewController.UserRow.self
case .setting:
return ViewController.RichTextRow.self
}
}
}
4. 使用快捷方法来布局你的表格视图
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return numberOfEnumeratedSections
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numberOfEnumeratedRows(in: section)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return enumeratedCell(at: indexPath, inside: tableView)
}
}
利用行编号
1. 除了文本,你还可以在你行编号中提供行高
enum SelectableRow: Int, RowEnumeration {
case about
case githubRepo
var text: String? {
switch self {
case .about:
return "About EnumeratedTable"
case .githubRepo:
return "GitHub Repository"
}
}
var height: CGFloat? {
return 56
}
}
2. 在你的控制器代理实现中返回行高
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return enumeratedRow(at: indexPath)?.height ?? UITableView.automaticDimension
}
利用枚举的优点
默认情况下,您可以提供文本、详细内容(适合UITableViewCell实例的详情标签)和高度。
但由于枚举是enum
(当然),您可以提供任何想要的值。
1. 提供标题,子标题
extension ViewController: TableEnumerated {
// ...
enum RichTextRow: Int, RowEnumeration {
case row1
case row2
var text: String? {
switch self {
case .row1:
return "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
case .row2:
return "Ut enim ad minim veniam."
}
}
var headline: String {
switch self {
case .row1:
return "Row 1"
case .row2:
return "Row 2"
}
}
var subhead: String {
switch self {
case .row1:
return "Subhead 1"
case .row2:
return "Subhead 2"
}
}
}
// ...
}
2. 将您的自定义单元格符合枚举
extension RichTextTableViewCell: Enumerable {
func configure(using enumerated: RowEnumerated) {
let enumerated = enumerated as! ViewController.RichTextRow
headlineLabel.text = enumerated.headline
subheadLabel.text = enumerated.subhead
bodyLabel.text = enumerated.text
}
}
extension AvatarTableViewCell: Enumerable {
func configure(using enumerated: RowEnumerated) {
let enumerated = enumerated as! ViewController.UserRow
nameLabel.text = enumerated.text
avatarImageView.image = enumerated.image
}
}
处理选择
handleSelection
方法
1. 在您的行枚举中实现extension ViewController: TableEnumerated {
// ...
enum SelectableRow: Int, RowEnumeration {
case about
case githubRepo
func handleSelection(by viewController: UIViewController) {
switch self {
case .about:
viewController.performSegue(withIdentifier: "Show About", sender: nil)
case .githubRepo:
let url = URL(string: "https://github.com/EdgarDegas/EnumeratedTable")!
let safariViewController = SFSafariViewController(url: url)
viewController.present(safariViewController, animated: true)
}
}
}
// ...
}
2. 在控制器的代理实现中调用快捷方法
extension ViewController: UITableViewDelegate {
// ...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
handleSelection(at: indexPath, by: self)
}
// ...
}