关于TableView:如何通过类管理节标题和行?

时间:2019-01-13 01:49:29

标签: ios swift uitableview tableview

因此,我一直在研究Swift,并尝试将TableView与两个部分一起使用。事情是: 我已经成功地使用TableViewController开发了一个只有一部分的应用程序,并使用了来自“ Opcao”类的数据来填充行。

因此,我决定通过在return 2上设置override func numberOfSections(in tableView: UITableView) -> Int来创建另一个部分,它确实有效,我实际上只需要两个部分。

我的问题:两个部分都显示相同数量的行和相同的内容。我该如何更改?我的意思是,我希望第二部分称为“ Teste”具有自己的单元格字段(与第一部分不同),但也要填充Opcao类的信息。

TableView上的节名称实际上应该是称为“节”的属性,行内容应该是单元格中的行数是哪种“节”具有多少个对象。我该怎么办?

Opcao.swift:

class Opcao {
var nome:String
var descricao: String
var section: String
var segueIdentifier: String


init(nome: String, descricao: String, section: String, segueIdentifier: String){
    self.nome = nome //displayed as main value of the cell
    self.descricao = descricao //description which goes bellow the cell title
    self.section = section // what I though it could be the section tittle which the option belongs to
    self.segueIdentifier = segueIdentifier //used for other stuff, not relevant to this situation

}

TableViewController.swift的部分:

class TableViewController: UITableViewController {

var opcoes: [Opcao] = []
var titulos: [String] = ["1a Habilitação", "Teste"]


override func viewDidLoad() {
    super.viewDidLoad()

    gerarOpcoes()
}




func gerarOpcoes(){


    //criando opcao 1
    var opcao1: Opcao
    opcao1 = Opcao(nome: "Novo simulado", descricao: "Clique para começar um novo simulado.", section: "phab", segueIdentifier: "A")
    self.opcoes.append(opcao1)


    //criando opcao 2
    var opcao2: Opcao
    opcao2 = Opcao(nome: "Responder livremente", descricao: "Responda diversas perguntas sem tempo limite.", section: "phab", segueIdentifier: "B")
    self.opcoes.append(opcao2)


    //criando opcao 3
    var opcao3: Opcao
    opcao3 = Opcao(nome: "Histórico", descricao: "Veja seus últimos resultados.", section: "phab", segueIdentifier: "C")
    self.opcoes.append(opcao3)

}
// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 2
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return opcoes.count
}

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

    let cell = self.tableView.dequeueReusableCell(withIdentifier: "celula", for: indexPath)
    cell.textLabel?.text = self.opcoes[indexPath.row].nome
    cell.detailTextLabel?.text = self.opcoes[indexPath.row].descricao

    return cell
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return titulos[section]
}

2 个答案:

答案 0 :(得分:1)

您可以通过多种方式进行操作。最简单的方法是对不同部分使用不同的数组(尽管这可能不是最佳方法)。然后也根据需要更改numberofRowsInSection。让我们看看:

创建另一个数组:

var opcoesSecond: [Opcao] = []

第二个数组的另一种部署方法,这次只允许放置两个对象:

func gerarOpcoesForSecond(){
    var opcao1: Opcao
    opcao1 = Opcao(nome: "Novo simulado", descricao: "Clique para começar um novo simulado.", section: "phab", segueIdentifier: "A")
    self.opcoesSecond.append(opcao1)

    //criando opcao 2
    var opcao2: Opcao
    opcao2 = Opcao(nome: "Responder livremente", descricao: "Responda diversas perguntas sem tempo limite.", section: "phab", segueIdentifier: "B")
    self.opcoesSecond.append(opcao2)
}

viewDidLoad中调用两种阵列部署方法:

override func viewDidLoad() {
    super.viewDidLoad()
    gerarOpcoes()
    gerarOpcoesForSecond()
}

然后使用您的numberofRowsInSection方法:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
        return opcoes.count        
    } else {
        return opcoesSecond.count
    }
}

在您的cellForRowAt方法中:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "celula", for: indexPath)

    if indexPath.section == 0 {
        cell.textLabel?.text = self.opcoes[indexPath.row].nome
        cell.detailTextLabel?.text = self.opcoes[indexPath.row].descricao
    } else {
        cell.textLabel?.text = self.opcoesSecond[indexPath.row].nome
        cell.detailTextLabel?.text = self.opcoesSecond[indexPath.row].descricao
    }
    return cell
}

再次如评论中所述,二维数组可能会更好地防止代码重复,就像我们在cellForRowAt方法中那样。

但这应该可以解决您的问题。

答案 1 :(得分:0)

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return opcoes.count
}

您应该根据该部分返回计数。

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

    let cell = self.tableView.dequeueReusableCell(withIdentifier: "celula", for: indexPath)
    cell.textLabel?.text = self.opcoes[indexPath.row].nome
    cell.detailTextLabel?.text = self.opcoes[indexPath.row].descricao

    return cell
}

再次,您应根据该部分设置单元格。