Как я могу получить доступ к первому элементу второго раздела в моем enum? - PullRequest
1 голос
/ 07 июня 2019

Я сделал слайд в меню с 2 разделами и написал все дела в одном перечислении. Я знаю, что каждый раздел начинается с индекса 0 и что я получу одинаковое значение для каждого элемента в разных разделах.

enum MenuType: Int {
//section 1
case plan 
case documentation
case visitlist
case document
case constructdiary
case plancorrection
//section 2
case sync
case settings
case info }

class MenuViewController: UITableViewController {

@IBOutlet weak var imageView: UIImageView!
var didTapMenuType: ((MenuType) -> Void)?

override func viewDidLoad() {
    super.viewDidLoad()
    setupImageView()
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let menuType = MenuType(rawValue: indexPath.row) else { return }
    dismiss(animated: true) { [weak self] in
        self?.didTapMenuType?(menuType)
    }
}

private func setupImageView() {
    imageView.frame = CGRect(x: 0, y: 0, width: 35, height: 35)
}

}

Можно ли отредактировать мой код так, чтобы в моем случае значение .sync отличалось от значения .plan в моем случае?

1 Ответ

1 голос
/ 07 июня 2019

Добавить свойства раздела и строки в перечисление следующим образом

enum MenuType: Int, CaseIterable, CustomStringConvertible {

    //section 1
    case plan, documentation, visitlist, document, constructdiary, plancorrection
    //section 2
    case sync, settings, info

    var section: Int {
        switch self {
        case .plan,.documentation,.visitlist,.document,.constructdiary,.plancorrection: return 0
        case .sync,.settings,.info: return 1
        }
    }
    var row: Int? {
        switch self.section {
        case 0: return self.rawValue
        case 1: return self.rawValue - MenuType.allCases.filter { $0.section < self.section }.count
        default: return nil
        }
    }
    var description: String {
        switch self {
        case .plan: return "plan"
        case .documentation: return "documentation"
        case .visitlist: return "visitlist"
        case .document: return "document"
        case .constructdiary: return "constructdiary"
        case .plancorrection: return "plancorrection"
        case .sync: return "sync"
        case .settings: return "settings"
        case .info: return "info"
        }
    }
}

Вы можете получить выбранный тип меню, сравнив раздел indexPath и строку

class MenuViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
    }
    override func numberOfSections(in tableView: UITableView) -> Int {
        return Array(Set(MenuType.allCases.map { $0.section })).count
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return MenuType.allCases.filter{ $0.section == section }.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")//tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let type = MenuType.allCases.first(where: { $0.section == indexPath.section && $0.row == indexPath.row })
        cell.textLabel?.text = type?.description
        return cell
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedMenuType = MenuType.allCases.first(where: { $0.section == indexPath.section && $0.row == indexPath.row })
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...