如何按类别显示UITableView Cells?

时间:2017-04-18 13:37:32

标签: ios uitableview

我希望UITableView显示以下数据:

required output

而不是:

my current output

我使用的代码如下:

// 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方式排序)

2 个答案:

答案 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改进此代码,但为了快速,我跳过了那部分