Ios as TableView数据源的Swift通用枚举
我想创建一个UITableViewController,它接受一个Ios as TableView数据源的Swift通用枚举,ios,swift,enums,Ios,Swift,Enums,我想创建一个UITableViewController,它接受一个enum作为它的数据源。 问题是,我希望它能够处理相当多的enum 我创建了一个名为tableviewselectible的协议,并创建了一些符合该协议的enum,如下所示: protocol TableViewSelectable { } enum Genders: Int, TableViewSelectable { case male = 0, female static let allKeys = [
enum
作为它的数据源。
问题是,我希望它能够处理相当多的enum
我创建了一个名为tableviewselectible
的协议,并创建了一些符合该协议的enum
,如下所示:
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?
}
问题是我不知道该怎么走。
我想要的是,提供符合tableviewselectible
的UITableViewController
任何enum
的选项,以便用作其数据源
我想在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
}
}
请帮忙?:) 当前实现的问题是,应该在
UITableViewDataSource
方法中使用的allKeys
和allNames
静态属性不是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
}
}
你做了一些事情,但不知道从哪里开始-那么你到底为什么想要一个接受enum作为数据源的表视图?@mag_zbc因为我需要一个通用的表视图,我可以从任何地方启动,并使用不同的enum作为数据源初始化它所以,可以添加一些示例说明如何实现表视图数据源方法吗?这正是我所需要的。谢谢!:)