目前我有uitableview
个自定义单元格。
它包含一个uilabel
和uibutton
- 数据源,从两个单独的数组中获取。
uibutton
函数是使用uilabel
的行附加相应的数组,并将其插入uitableview
,并在下面添加另一个uibutton
的新单元格。
有一个条件 - 一旦问题数组值为nil,就会显示答案uibutton
。
问题是 - 因为uibutton
名称被取为数组中的最后一个值,一旦我滚动所有按钮标题正在被重写以匹配最新的那个。
这是我的代码
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return numberofsections
// is always equal to zero
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return someTagsArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TblCell
cell.lblCarName.text = someTagsArray[indexPath.row]
cell.act1.setTitle(answersdict.last, forState:UIControlState.Normal)
return cell
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
var cell:TblCell = cell as! TblCell
if let text = cell.lblCarName.text where text.isEmpty {
cell.act1.hidden = false
} else {
println("Failed")
}
}
有没有办法存储这些uibutton
值或阻止细胞完全重复使用。
关于我的问题\答案模型的更多数据 我有一个带有嵌套数组的字典,名为linesmain for questions
linesmain = ["first":["question 1", "question 2", "question 3"], "answer 1": ["question 1", "question 2", "question 3"], "answer 2": ["question 1", "question 2", "question 3"], "answer 3":["question 1", "question 2", "question 3"]]
和类似的答案词典
answersmain = ["first": ["answer 1"], "answer 1": ["answer 2"], "answer 2": ["answer 3"], "answer 3":["answer 4"]]
我保持这种方式,因为我可能会增加未来的答案数量。
然后我有两个数组要追加细胞。
一个附加 - 问题(someTagsArray),另一个 - 答案(答案)。
在发布时,第一个"加载问题和答案,然后取决于新附加单元格中的uibutton
currentTitle。
谢谢。
答案 0 :(得分:2)
不,没有办法阻止细胞被重复使用。重用可以降低内存需求并快速滚动,因为表只保留足够的单元格以确保它可以显示可见的行。
当您前后滚动时,将不断重复使用单元格。这是正常的,预期的,并不意味着被规避。
您必须以可以通过indexPath行查找答案的方式将这些答案值存储在模型中。
更改answersdict.last
以使用某种占用一行的方法,并返回该行的答案文本。
如果您不确定如何操作,则需要发布更多代码,以显示模型如何存储您的问题和答案数据。
<强>更新强>
一般情况下,我可能会考虑采取一些不同的方式。
可以选择tableView单元格。您可以让用户选择(点击)单元格完成按钮事件的工作,而不是向单元格添加按钮。
作为the answer to your original question suggested,您最好将数据划分为多个部分,每个部分都包含该部分的问题和答案:
Section 0 Question 1 // row 0 of section 0 Question 2 // row 1 of section 0 Question 3 Answer 1 Section 1 Question 1 // row 0 of section 1 Question 2 // row 1 of section 1 and so forth...
您的someTagsArray
会更好地存储,如[[问题1,问题2,问题3],[问题1,问题2,问题3],......]。你看到每组问题是如何在它自己的(部分)数组中的?
然后,您可以通过查询someTagsArray[indexPath.section][indexPath.row]
查询answersArray[indexPath.section]
和每个答案的文字来获取每个问题的文字。
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return someTagsArray.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return someTagsArray[section].count + 1 // number of Questions + 1 for the answer
}
更新2:
您是否看到了如何将数据分解为多个部分的示例?让我们看看第一部分的计数,即第0部分:
someTagsArray[0].count // 3 questions in section 0
answersArray[0] // the one answer for section 0
问题和答案的数量并不相等。正如你所指出的那样,这没有任何意义。
所以,现在我们看到第0部分有3个问题和1个答案,我们知道第0部分有4行。
前三行是问题所在。最后一行是答案。
因此,在tableView:cellForRowAtIndexPath
中,您必须检查indexPath.row
,并确定它是问题行还是答案行。这应该是相当容易的,我会将其作为练习。
答案 1 :(得分:2)
如果表格中的行数超出屏幕上可以容纳的数量,则表示您的方法存在问题。在这种情况下,将重新使用滚出屏幕的单元格,并且按钮的内容将丢失。如果您确定永远不会发生这种情况,请使用单独的datasource
数组作为按钮标题。
您必须创建一个包含按钮标题的单独数组,您可以对indexPath.row
使用它们。希望这有帮助