【问题标题】:UIbutton currentTitle in cell reused Swift单元格中的 UIbutton currentTitle 重用了 Swift
【发布时间】:2015-11-25 16:49:08
【问题描述】:

目前我有一个带有自定义单元格的uitableview。 它包含一个uilabeluibutton - 从两个单独的数组中获取的数据源。 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,用于提问

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),另一个 - 答案 (answersdict)。 启动时会加载“第一个”问题和答案,然后根据新附加单元格中的uibutton currentTitle。

谢谢。

【问题讨论】:

  • 请出示您的tableView:numberOfSectionstableView:numberOfRowsForSection: 代码,以便我们查看您的问题和答案如何映射到(部分和)行。
  • @PetahChristian 这样做。以及在我的模型上添加信息。
  • 您需要显示someTagsArray,以便我们可以看到问题和答案是如何添加到该数组中的。因为您需要做的是从someTagsArray[indexPath.row] 中提取答案文本并将其分配给该行的答案按钮。
  • @PetahChristian 它们看起来像这样 someTagsArray = [question 1, question 2, question 3]; answersdict = [answer1] 附加数组后它们看起来像这样 someTagsArray = [question1, question 2, question 3, question 1, question 2, question 3]; answersdict = [answer1, answer 2]

标签: ios swift uitableview reusability


【解决方案1】:

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

当您来回滚动时,单元格将不断重复使用。这是正常的、意料之中的,并不是要规避的。

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

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

如果您不确定如何执行此操作,则需要发布更多代码来展示您的模型如何存储您的问答数据。

更新

总的来说,我会做一些不同的事情,您可能需要考虑一下。

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

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

第 0 节 问题 1 // 第 0 部分的第 0 行 问题 2 // 第 0 部分的第 1 行 问题 3 答案 1 第 1 节 问题 1 // 第 1 部分的第 0 行 问题 2 // 第 1 部分的第 1 行 等等……

您的someTagsArray 最好存储为 [[question 1, question 2, question 3],[question 1, question 2, question 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,并确定它是问题行还是答案行。这应该很容易做到,我将把它留作练习。

【讨论】:

  • 不知道该怎么做。请查看我已添加请求的信息。
  • 完成。我添加了一个示例,展示了如何使用部分和行来对每组问题和答案进行分组。
  • 我会试试这些代码。感谢您的大力帮助。
  • 创建二维数组,设置numberOfsectionsnumberOfRowsInSectioncellForRowAtIndexPath代码。但我有一个“数组超出范围”错误导致此代码cell.lblCarName.text = someTagsArray[indexPath.section][indexPath.row] ((
  • 目前有两个数组 - 一个二维“someTagsArray”另一个简单数组“answersArray”。它们的对象数相等。
【解决方案2】:

如果表中的行数超过了屏幕上可以容纳的行数,那么您的方法就会出现问题。在这种情况下,滚动到屏幕外的单元格将被重新使用,并且按钮的内容将丢失。如果您可以确定这永远不会发生,请使用单独的 datasource 数组作为按钮标题。

您必须创建一个带有按钮标题的单独数组,并且可以将它们用于indexPath.row。希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多