关于 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 的高度应该等于它的内容