单元格中的UI按钮currentTitle重用Swift

时间:2015-08-31 15:32:13

标签: ios swift uitableview reusability

目前我有uitableview个自定义单元格。 它包含一个uilabeluibutton - 数据源,从两个单独的数组中获取。 uibutton函数是使用uilabel的行附加相应的数组,并将其插入uitableview,并在下面添加另一个uibutton的新单元格。

有一个条件 - 一旦问题数组值为nil,就会显示答案uibutton

问题是 - 因为uibutton名称被取为数组中的最后一个值,一旦我滚动所有按钮标题正在被重写以匹配最新的那个。

这是流程。 enter image description here

这是我的代码

 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。

谢谢。

2 个答案:

答案 0 :(得分:2)

不,没有办法阻止细胞被重复使用。重用可以降低内存需求并快速滚动,因为表只保留足够的单元格以确保它可以显示可见的行。

当您前后滚动时,将不断重复使用单元格。这是正常的,预期的,并不意味着被规避。

您必须以可以通过indexPath行查找答案的方式将这些答案值存储在模型中。

更改answersdict.last以使用某种占用一行的方法,并返回该行的答案文本。

如果您不确定如何操作,则需要发布更多代码,以显示模型如何存储您的问题和答案数据。

<强>更新

一般情况下,我可能会考虑采取一些不同的方式。

  1. 可以选择tableView单元格。您可以让用户选择(点击)单元格完成按钮事件的工作,而不是向单元格添加按钮。

  2. 作为the answer to your original question suggested,您最好将数据划分为多个部分,每个部分都包含该部分的问题和答案:

  3.     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使用它们。希望这有帮助