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

Posted

技术标签:

【中文标题】关于 TableViews:如何通过类管理节标题和行?【英文标题】:Regarding TableViews: How can I manage section titles and rows through classes? 【发布时间】:2019-01-13 01:49:29 【问题描述】:

所以我一直在研究 Swift 并尝试使用包含两个部分的 TableView。事情是: 我已经成功地使用 TableViewController 开发了一个应用程序,其中只有一个部分,并使用名为“Opcao”的类中的数据来填充行。

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

我的问题:两个部分都呈现相同的行数和相同的内容。我怎么能改变它?我的意思是,我希望名为“Teste”的第二部分有自己的单元格字段(与第一部分不同),但也填充了 Opcao 类的信息。

我的TableView上的section名称实际上应该是名为“section”的属性,而rows内容应该是一个单元格中的行数,即有多少个对象,属于哪种“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]

【问题讨论】:

链接到我的 TableView 外观的打印屏幕:imgur.com/a/i5rON00 您需要第二个数组或多维数组来为其他部分提供数据 无关:如果您只是将数据转储到Opcao,您可能只想将其设为struct,这样您就不必为它编写初始化程序。 【参考方案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

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

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

【讨论】:

【参考方案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

同样,您应该根据部分设置单元格。

【讨论】:

以上是关于关于 TableViews:如何通过类管理节标题和行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 tableViews 自调整单元格时在运行时更改表格视图单元格高度?

一个 UIView Swift 中的多个 TableViews - 如何同时显示

一个视图控制器中的两个 tableviews 和 tableviews 的高度应该等于它的内容

Swift 3 TableView Segue 到多个其他 TableViews

TabBarController 和 TableViews

NSFetchedResultsController 和 TableViews