当我向下滚动并快速返回时,Tableview单元格设置保持不变

时间:2017-10-11 10:05:48

标签: swift

我试图像这张图片一样制作一个桌面视图(1)。当表格查看单元格的文本得到"取消计划"或"关闭日"按钮">"将是灰色的,单元格无法点击。

我的代码是有效的,但是当我向下滚动并返回时,设置会变得混乱。设置将随机改变,如图像(2)和(3)。为什么呢?

图片(1):https://www.dropbox.com/s/0k6ldrfx5nzyt9e/1.jpg?dl=0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "rosterId", for: indexPath) as! RosterCell
        ...
        if jobCancel[indexPath.section] == 0{
            cell.separator.backgroundColor = UIColor.darkGray
            cell.jobDetail.textColor = UIColor.gray
            cell.button.isEnabled = false
            cell.button.alpha = 0.3;
        }
        if cell.jobDetail.text == "Cancelled Schedule"{
            cell.separator.backgroundColor = UIColor.red
            cell.button.isEnabled = false
            cell.button.alpha = 0.3;
            cell.isUserInteractionEnabled = false
        }
        if cell.jobDetail.text == "Off Day"{
            cell.separator.backgroundColor = UIColor.darkGray
            cell.button.isEnabled = false
            cell.button.alpha = 0.3;
            cell.isUserInteractionEnabled = false
        }

}

像image(2)或image(3)

图片(2):https://www.dropbox.com/s/jmile0vxpcqgt92/2.jpg?dl=0

image(3):https://www.dropbox.com/s/94ef4hb996afmm6/3.jpg?dl=0

1 个答案:

答案 0 :(得分:0)

原因是细胞重用。

这意味着已经以某种方式设置样式的单元格可以重复使用以显示不同的数据。每次重复使用单元格时,您必须确保设置样式的每个方面,以避免交叉。

如果您使用configureCell方法来处理它,可能更容易跟踪样式,这样您就可以忘记设置一个值,甚至可以设置一些默认值值。

func configureCell(cell:RosterCell,
               textColour:UIColor,
               seperatorColour:UIColor,
               buttonEnabled:Bool,
               buttonAlpha:CGFloat,
               interactionEnabled:Bool = false) {

        cell.separator.backgroundColor = seperatorColour
        cell.jobDetail.textColor = textColour
        cell.button.isEnabled = buttonEnabled
        cell.button.alpha = buttonAlpha
        cell.isUserInteractionEnabled = interactionEnabled

}

然后您的cellForRowAt方法看起来像这样

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "rosterId", for: indexPath) as! RosterCell
    ...
    if jobCancel[indexPath.section] == 0{
        configureCell(cell: cell,
                  textColour: UIColor.gray,
                  seperatorColour: UIColor.darkGray,
                  buttonEnabled: false,
                  buttonAlpha: 0.3,
                  interactionEnabled: true)
    }
    if cell.jobDetail.text == "Cancelled Schedule"{
        configureCell(cell: cell,
                  textColour: UIColor.gray,
                  seperatorColour: UIColor.red,
                  buttonEnabled: false,
                  buttonAlpha: 0.3)
    }
    if cell.jobDetail.text == "Off Day"{
        configureCell(cell: cell,
                  textColour: UIColor.gray,
                  seperatorColour: UIColor.darkGray,
                  buttonEnabled: false,
                  buttonAlpha: 0.3)
    }

}

正如您所看到的,我已将interactionEnabled参数设置为默认为false,因此我无需为最后两个if语句设置它。