Быстрые перечисления для источника данных TableView - PullRequest
0 голосов
/ 23 мая 2018

Я хочу создать UITableViewController, который принимает enum в качестве источника данных.Дело в том, что у меня есть довольно много enums, которые я хочу, чтобы он мог обрабатывать.

Я создал протокол с именем TableViewSelectable и создал несколько enums, которые соответствуют ему следующим образом:

protocol TableViewSelectable {

}

enum Genders: Int, TableViewSelectable {
    case male = 0, female

    static let allKeys = [male, female]
    static let allNames = [male.getName, female.getName]

    var getName: String {
        switch self {
        case .male:
            return "Male"
        case .female:
            return "Female"
        }
    }
}

enum Goals: Int, TableViewSelectable {
    case gainMuscleMass, getTrimFit, loseWeight

    static let allKeys = [gainMuscleMass, getTrimFit, loseWeight]
    static let allNames = [gainMuscleMass.getName, getTrimFit.getName, loseWeight.getName]

    var getName: String {
        switch self {
        case .gainMuscleMass:
            return "Gain muscle mass"
        case .getTrimFit:
            return "Get trim & fit"
        case .loseWeight:
            return "Lose weight"
        }
    }
}

И я создал переменную экземпляра на моем UITableViewController примерно так:

class ChoiceListTableViewController: UITableViewController {

    var data: TableViewSelectable?

}

Проблема в том, что я понятия не имею, как идти отсюда.То, что я хочу иметь, это возможность дать UITableViewController любой enum, который соответствует TableViewSelectable, для использования в качестве источника данных.

Я хочу получить к нему доступ на UITableViewControllerэто:

final class ChoiceListTableViewController: UITableViewController {

    var data: TableViewSelectable?


    // MARK: Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        self.clearsSelectionOnViewWillAppear = false
    }

}

// MARK: Table View Data Source & Delegate

extension ChoiceListTableViewController {

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return data.allKeys.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ChoiceTableViewCell", for: indexPath)

        cell.textLabel?.text = data.allNames[indexPath.row]

        return cell
    }

}

Помогите пожалуйста?:)

1 Ответ

0 голосов
/ 23 мая 2018

Проблема с текущей реализацией заключается в том, что статические свойства allKeys и allNames, которые вы должны использовать в методе UITableViewDataSource, не являются частью протокола TableViewSelectable, поэтому вы не можете получить к ним доступ с помощью data переменная.

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

protocol TableViewSelectable {
    static var allKeys: [TableViewSelectable] {get}
    static var allNames: [String] {get}
}

Вам также необходимо изменить соответственно enum s.

enum Genders: Int, TableViewSelectable {
    case male = 0, female

    static let allKeys:[TableViewSelectable] = [male, female]
    static let allNames = [male.getName, female.getName]

    var getName: String {
        switch self {
        case .male:
            return "Male"
        case .female:
            return "Female"
        }
    }
}

enum Goals: Int, TableViewSelectable {
    case gainMuscleMass, getTrimFit, loseWeight

    static let allKeys:[TableViewSelectable] = [gainMuscleMass, getTrimFit, loseWeight]
    static let allNames = [gainMuscleMass.getName, getTrimFit.getName, loseWeight.getName]

    var getName: String {
        switch self {
        case .gainMuscleMass:
            return "Gain muscle mass"
        case .getTrimFit:
            return "Get trim & fit"
        case .loseWeight:
            return "Lose weight"
        }
    }
}

Тогда вы можете просто использовать data.allKeys и data.allNames для доступа к соответствующему элементу этих массивов в ваших методах источника данных.

class ChoiceListTableViewController: UITableViewController {
    var data:TableViewSelectable.Type! // make sure that this is actually initialized before accessing it

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.allKeys.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "id", for: indexPath)
        cell.textLabel?.text = data.allNames[indexPath.row]
        return cell
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...