所以我一直在研究斯威夫特,并试图使用两个部分的表格视图。问题是:
我已经成功地开发了一个应用程序,使用TableViewController和一个名为“Opcao”的类中的数据来填充行。
所以我决定通过将return 2设置为override func numberOfSections(in tableView: UITableView) -> Int来创建另一个部分,它起作用了,我只需要两个部分。
我的问题是:这两个部分显示的行数和内容都是相同的。我该怎么改?我的意思是,我希望称为“Teste”的第二部分有自己的单元字段(不同于第一部分),但也填充了Opcao类的信息。
我的TableView上的节名称实际上应该是名为“section”的属性,行内容应该是单元格中的行数,即有多少对象使用哪种“section”。我该怎么办?
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]
}

最佳答案

你可以用多种方法来做。最简单的方法是为不同的部分使用不同的数组(尽管这可能不是最好的方法)。然后根据这个改变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方法中所做的那样。
但这应该能解决你的问题。

08-27 18:58