测验根据正确或错误更改细胞背景

时间:2015-11-24 15:42:05

标签: ios swift uitableview

我试图进行测验,所以当你点击nextButton时,它会检查问题是否正确,是否应该使细胞变绿,如果错误则应该chosenCell红色和correctCell绿色。然而,它似乎继续重新标记标签而不是使细胞正确的颜色。这是一个例子,当我选择正确的一个。它使第一个单元格的textColor变为白色并重置正确的标签?

插图

enter image description here

的cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! QuestionCell


        cell.titleLabel.text = options[indexPath.row]



        return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("NextCell", forIndexPath: indexPath) as! NextCell

        if colorCheck > 186 {

            cell.nextButton.backgroundColor = UIColor(rgba: quizObject!.navButtonsColor)
        } else {
            cell.nextButton.backgroundColor = UIColor(rgba: quizObject!.navBarColor)
        }


        cell.nextButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
        cell.nextButton.addTarget(self, action: "done", forControlEvents: UIControlEvents.TouchUpInside)
        cell.selectionStyle = UITableViewCellSelectionStyle.None

        return cell
    }


}

didSelectRowAtIndexPath并完成

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
   chosenIndex = indexPath.row
}


func done() {
    if chosenIndex != nil {

            tableView?.deselectRowAtIndexPath(NSIndexPath(forRow: chosenIndex!, inSection: 0), animated: true)

            let cell = tableView!.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: NSIndexPath(forRow: chosenIndex!, inSection: 0)) as! QuestionCell
            cell.titleLabel.textColor = UIColor.whiteColor()

        let cell2 = tableView!.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: NSIndexPath(forRow: correctIndex, inSection: 0)) as! QuestionCell
        cell2.titleLabel.textColor = UIColor.whiteColor()


        if chosenIndex! == correctIndex {
            cell.backgroundColor = UIColor.greenColor()
        } else {
            cell.backgroundColor = UIColor.redColor()
            cell2.backgroundColor = UIColor.greenColor()
        }


        tableView?.reloadData()

    }



}

1 个答案:

答案 0 :(得分:1)

首先:你正在滥用出局机制。如果您想获得现有的单元格,请使用

tableView(_:cellForRowAtIndexPath:)

其次,你不应该在if indexPath.section == 0 { let cell = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! QuestionCell cell.titleLabel.text = options[indexPath.row] if let chosen = chosenIndex { if chosen == indexPath.row { if indexPath.row == correctIndex { cell.backgroundColor = UIColor.greenColor() } else { cell.backgroundColor = UIColor.redColor() } } else { if indexPath.row == correctIndex { cell.backgroundColor = UIColor.greenColor() } else { cell.backgroundColor = UIColor.whiteColor() } } } else { cell.backgroundColor = UIColor.whiteColor() } return cell } 内部以外的任何地方操纵单元格。原因是如果UITableView决定重新加载其内容,那么仅在上述方法之外完成的所有更改都将丢失。

您必须改变支持状态并手动重新加载受影响的行。

您必须将当前的逻辑更改为

func done()

tableView中,您只需告诉brew install leiningen 正确的行:

  • 如果选择了正确的单元格,则选择正确的
  • 如果选择错误,
  • 选定的单元格和正确的单元格

请注意,我省略了设置textColor属性,因为它们的逻辑类似于backgroundColor,我认为你可以而且应该弄清楚如何正确设置它们。