来自UITableView的视图消失

时间:2016-09-25 15:59:15

标签: ios swift uitableview uiview

我有一个显示14种不同视图的自定义单元格。根据单元格接收的数据,它应该显示等于某些数据的.count的视图,并且颜色应该根据它的数据而改变。

例如:

如果它正在接收三种类型的数据,它应该只显示3个视图。可能是ice cream, candy, marshmellows。然后它会在orange (ice cream), blue (candy), green (marshmellows)中显示三个视图。

我的工作非常好,我很兴奋。问题是,如果我有一个显示三个视图的单元格并向下滚动到只包含一个视图的单元格(因为数据只有一个),那么当我再次向上滚动到第一个单元格时应该最初显示三个视图时,它是只显示1,第一个..

我有一个例子:

故事板中我的自定义单元格是这样的,绿色和黑色框是不同的视图 enter image description here

这是6类数据的样子: enter image description here

当我向下滚动到包含一个视图的单元格时,具有6个视图的单元格将在此后显示如下:

enter image description here

以下是一些相关代码:

让我解释一下代码。在我的数据库中,每个帖子都有一个类别为1或2.这就是代码在update.category中搜索的内容。如果它是类别1,那么它只是纯文本。如果它是类别2(或其他),它应该显示视图,所以我实际上必须在我的UITableViewController中的单元格类型。

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

    let update = updates[indexPath.row]

    if update.category == 1 {

        let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell

        cell.nameButton.setTitle(update.addedByUser, forState: .Normal)

        return cell

    } else {

        let cellSugar:newSugarTableViewCell = tableView.dequeueReusableCellWithIdentifier("CellSugar", forIndexPath: indexPath) as! newSugarTableViewCell

        cellSugar.nameButton.setTitle(update.addedByUser, forState: .Normal)

        let sugarArray = update.content.componentsSeparatedByString("--")

        dispatch_async(dispatch_get_main_queue(), { () -> Void in

            cellSugar.sugarViewOne.layer.cornerRadius = cellSugar.sugarViewOne.frame.size.width/2
            cellSugar.sugarViewOne.clipsToBounds = true
            cellSugar.sugarViewOne.layer.borderColor = UIColor.whiteColor().CGColor
            cellSugar.sugarViewOne.layer.borderWidth = 2.0

            cellSugar.sugarViewTwo.layer.cornerRadius = cellSugar.sugarViewTwo.frame.size.width/2
            cellSugar.sugarViewTwo.clipsToBounds = true
            cellSugar.sugarViewTwo.layer.borderColor = UIColor.whiteColor().CGColor
            cellSugar.sugarViewTwo.layer.borderWidth = 2.0
        })


        if sugarArray.count == 1 {

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                let seperateSugarArray = sugarArray[0].componentsSeparatedByString("#")

                if seperateSugarArray[4] == "Candy" {
                    cellSugar.sugarViewOne.backgroundColor = UIColor(red: 97.0/255.0, green: 194.0/255.0, blue: 231.0/255.0, alpha: 1.0) // Blå

                } else if seperateSugarArray[4] == "Ice cream" {
                    cellSugar.sugarViewOne.backgroundColor = UIColor(red: 35.0/255.0, green: 117.0/255.0, blue: 147.0/255.0, alpha: 1.0) // Mørke grå/blå

                } else if seperateSugarArray[4] == "Marshmellows" {
                    cellSugar.sugarViewOne.backgroundColor = UIColor(red: 75.0/255.0, green: 212.0/255.0, blue: 159.0/255.0, alpha: 1.0) // Tyrkis

                }

                cellSugar.sugarViewTwo.hidden = true
                cellSugar.sugarViewThree.hidden = true
                cellSugar.sugarViewFour.hidden = true
                cellSugar.sugarViewFive.hidden = true
                cellSugar.sugarViewSix.hidden = true
                cellSugar.sugarViewSeven.hidden = true
                cellSugar.sugarViewEight.hidden = true
                cellSugar.sugarViewNine.hidden = true
                cellSugar.sugarViewTen.hidden = true
                cellSugar.sugarViewEleven.hidden = true
                cellSugar.sugarViewTwelve.hidden = true
                cellSugar.sugarViewThirteen.hidden = true
                cellSugar.sugarViewFourteen.hidden = true
            })


        } else if sugarArray.count == 2 {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                let seperateSugarArray = sugarArray[0].componentsSeparatedByString("#")
                let seperateSugarArrayTwo = sugarArray[1].componentsSeparatedByString("#")

                if seperateSugarArray[4] == "Candy" {
                    cellSugar.sugarViewOne.backgroundColor = UIColor(red: 97.0/255.0, green: 194.0/255.0, blue: 231.0/255.0, alpha: 1.0) // Blå

                } else if seperateSugarArray[4] == "Ice cream" {
                    cellSugar.sugarViewOne.backgroundColor = UIColor(red: 35.0/255.0, green: 117.0/255.0, blue: 147.0/255.0, alpha: 1.0) // Mørke grå/blå

                } else if seperateSugarArray[4] == "Marshmellows" {
                    cellSugar.sugarViewOne.backgroundColor = UIColor(red: 75.0/255.0, green: 212.0/255.0, blue: 159.0/255.0, alpha: 1.0) // Tyrkis

                }

                if seperateSugarArray[4] == "Candy" {
                    cellSugar.sugarViewTwo.backgroundColor = UIColor(red: 97.0/255.0, green: 194.0/255.0, blue: 231.0/255.0, alpha: 1.0) // Blå

                } else if seperateSugarArray[4] == "Ice cream" {
                    cellSugar.sugarViewTwo.backgroundColor = UIColor(red: 35.0/255.0, green: 117.0/255.0, blue: 147.0/255.0, alpha: 1.0) // Mørke grå/blå

                } else if seperateSugarArray[4] == "Marshmellows" {
                    cellSugar.sugarViewTwo.backgroundColor = UIColor(red: 75.0/255.0, green: 212.0/255.0, blue: 159.0/255.0, alpha: 1.0) // Tyrkis

                }


                cellSugar.sugarViewThree.hidden = true
                cellSugar.sugarViewFour.hidden = true
                cellSugar.sugarViewFive.hidden = true
                cellSugar.sugarViewSix.hidden = true
                cellSugar.sugarViewSeven.hidden = true
                cellSugar.sugarViewEight.hidden = true
                cellSugar.sugarViewNine.hidden = true
                cellSugar.sugarViewTen.hidden = true
                cellSugar.sugarViewEleven.hidden = true
                cellSugar.sugarViewTwelve.hidden = true
                cellSugar.sugarViewThirteen.hidden = true
                cellSugar.sugarViewFourteen.hidden = true


            })

        }

      return cellSugar
    }
}

我希望你明白并且你可以帮助我,因为它很烦人: - )

2 个答案:

答案 0 :(得分:1)

您必须更新每个条件的所有元素。 问题的原因:表视图重用单元格,所以如果你有一个单元格显示5个标签,滚动后你有另一个有3个而另外2个被隐藏,当你再次向上滚动时你必须让它们可见表格视图再次使用带有2个隐藏标签的表格视图。 在CellForRowAtIndexPath中,在每个条件中添加缺少的标签 或者在您的自定义UItableViewCell课程中添加方法prepareForReuse,并使所有标签可见。

答案 1 :(得分:0)

UITableView以一种单元格处于当前状态(配置了所有视图)的方式重用单元格,并将该单元格返回到另一行,您需要根据需要再次配置单元格。

if update.category == 1 {

    let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell
    cell.nameButton.setTitle(update.addedByUser, forState: .Normal)
    return cell

}

在返回之前,您需要为单元格配置当前行数据。