枚举表 1.0.0

枚举表 1.0.0

iMoeNya 维护。



枚举表 1.0.0

  • iMoe

枚举表

Build Status Swift Version

使用Swift枚举优雅地布局静态表格的方法。

预览

设置视图控制器代码混乱?试试枚举。

像这样枚举您的单元格和行。

由Xcode清晰地绘制轮廓。

同时保持视图控制器清洁。

最终得到的表格。

开始使用

先决条件

Cocoapods

如果还没有安装,请安装cocoapods。然后将其添加到您的podfile中。

pod 'EnumeratedTable', '~> 0.0.6'

Swift包管理器

首先确保您使用的是Xcode 11.0或更高版本。

然后,转到文件 -> Swift包 -> 添加包依赖...

Search for EnumeratedTable

快速教程

首先,考虑此存储库中的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
    }
}

处理选择

1. 在您的行枚举中实现handleSelection方法

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)
    }
    
    // ...
}