因此,我一直在研究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]
}
答案 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
}
再次,您应根据该部分设置单元格。