我希望UITableView显示以下数据:
而不是:
我使用的代码如下:
// Data model class defining an Animal
class Animal {
// data members
var name: String
var type: String
// initializer
init(name: String, type: String) {
self.name = name
self.type = type
}
}
和
// View Controller
import UIKit
class AnimalsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// an array of Animal(s)
var animals: [Animal] = [Animal("Cat", "Domestic"), Animal("Dog", "Domestic"), Animal("Lion", "Wild"), Animal("Deer", "Wild"), Animal("Tiger", "Wild")];
override func viewDidLoad() {
super.viewDidLoad();
}
// returns the number of rows to be present in table
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return animals.count
}
// returns each cell to be present in the table
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentfier = "animalbasic"
// uses a protype cell from storyboard
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentfier)
cell.textLabel.text = animals[indexPath.row].name
return cell
}
}
在我的代码中,为了获得所需的输出,我需要更改什么?(假设数组总是以Animal.type方式排序)
答案 0 :(得分:1)
您需要按类型将数据分成几个部分。
class AnimalsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var animals: [Animal] = [Animal("Cat", "Domestic"), Animal("Dog", "Domestic"), Animal("Lion", "Wild"), Animal("Deer", "Wild"), Animal("Tiger", "Wild")]
var sections: [[Animal]] = []
override func viewDidLoad() {
super.viewDidLoad();
var sectionForType = [String: [Animal]]()
for animal in animals {
if sectionForType[animal.type] == nil { sectionForType[animal.type] = [] }
sectionForType[animal.type]!.append(animal)
}
sections = sectionForType.keys.sorted().map({ sectionForType[$0]! })
}
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sections[section].count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sections[section][0].type
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "animalbasic")!
cell.textLabel!.text = sections[indexPath.section][indexPath.row].name
return cell
}
}
答案 1 :(得分:0)
建议:
对这类事物使用结构,而不是类
对于可支配性,我会使用wRcon.on('disconnect', function() {
console.log('You have been Disconnected!');
}.after(_ => wRcon.reconnect()));
作为动物类型,例如:
Function
注意:实际上并不需要使它成为字符串,你也可以有一个基于类型的函数会返回一个本地化的字符串,你可以编写像
这样的东西enum
现在你的结构看起来像这样
enum AnimalType: String {
case domestic = "Domestic"
case wild = "Wild"
}
现在您可以像这样启动它
enum AnimalType: String {
case domestic, wild
var localizedString: String {
switch self {
case .domestic: return "Domestic"
case .wild: return "Wild"
}
}
现在回到你的问题, 我建议将类型保留在节标题而不是单元格中,这样会更有意义吗?
创建变量
struct Animal {
let name: String
let type: AnimalType
}
现在你有了计数,也很容易扩展
let animal = Animal(name: "Cat", type: .domestic)
当然,你还必须为你的部分配置标题:
let sections = [.domestic, .wild]
你的方法也可行,但这意味着在numberOfRowsInSection你必须添加部分的数量:
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionType = sections[section]
switch sectionType {
case .domestic:
return animals.filter{ $0.type == .domestic }.count
case .wild:
return animals.filter{ $0.type == .wild }.count
default:
return 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let sectionType = sections[section]
switch sectionType {
case .domestic:
/// Configure your cell
case .wild:
/// Configure your cell
default:
assertionFailure("Should not reach in this situation")
return UITableViewCell()
}
}
然后func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let sectionType = sections[section]
switch sectionType {
default: sectionType.localizedString
}
会很痛苦,你需要做一些计算才能看到它是什么行,它是否仍然是狂野的国内,它是否狂野
TLTR你会有一堆// returns the number of rows to be present in table
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return animals.count + sections.count
}
,而且只有。{
添加一种类型(可能是恐龙)这种痛苦会让你回归
注意:可以使用viewModel改进此代码,但为了快速,我跳过了那部分