UICollectionView.reloadData()更改单元格顺序| iOS Swift

时间:2016-06-08 21:14:07

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewdelegate

所以我正在处理一个简单的UICollectionView,X行有3列,其中X由变量matchesFromSelectedSession.count + 1设置。以下是我用于collectionView的委托函数:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let cellHeight = 15.0 as CGFloat
    return CGSizeMake(collectionView.bounds.size.width/3, cellHeight)
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return matchesFromSelectedSession.count + 1
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let reuseIdentifier = "MatchCollectionViewCell"
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MatchCollectionViewCell
    cell.matchCollectionLabel = UILabel(frame: CGRectMake(0,0,collectionView.bounds.width/3 - 3.0,15))
    cell.matchCollectionLabel.textColor = UIColor.blackColor()
    cell.systemLayoutSizeFittingSize(cell.frame.size, withHorizontalFittingPriority: UILayoutPriorityDefaultHigh, verticalFittingPriority: UILayoutPriorityDefaultLow)
    cell.matchCollectionLabel.font = UIFont(name: "Helvetica Neue", size:12)
    if indexPath.section == 0 {
        switch indexPath.row {
        case 0:
            cell.matchCollectionLabel.text = "Match #"
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            cell.matchCollectionLabel.textAlignment = NSTextAlignment.Right
            break
        case 1:
            cell.matchCollectionLabel.text = "Record"
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            cell.matchCollectionLabel.textAlignment = NSTextAlignment.Center
            break
        case 2:
            cell.matchCollectionLabel.text = "Outcome"
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            break
        default:
            cell.matchCollectionLabel.text = ""
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            break
        }
    } else {
        switch indexPath.row {
        case 0:
            cell.matchCollectionLabel.text = "\(indexPath.section)"
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            cell.matchCollectionLabel.textAlignment = NSTextAlignment.Right
            break
        case 1:
            cell.matchCollectionLabel.text = matchesFromSelectedSession[indexPath.section - 1].matchRecord()
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            cell.matchCollectionLabel.textAlignment = NSTextAlignment.Center
            break
        case 2:
            let outcome = matchesFromSelectedSession[indexPath.section - 1].matchOutcome()
            switch outcome {
            case "W":
                cell.matchCollectionLabel.text = "Win"
                cell.matchCollectionLabel.textColor = UIColor.greenColor()
                break
            case "D":
                cell.matchCollectionLabel.text = "Draw"
                cell.matchCollectionLabel.textColor = UIColor.blueColor()
                break
            case "L":
                cell.matchCollectionLabel.text = "Loss"
                cell.matchCollectionLabel.textColor = UIColor.redColor()
                break
            default:
                cell.matchCollectionLabel.textColor = UIColor.blackColor()
                break
            }
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            break
        default:
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            cell.matchCollectionLabel.text = ""
            break
        }
    }
    //add subview if new cell otherwise tag cell to know to reuse next time
    if cell.tag != 19 {
        cell.addSubview(cell.matchCollectionLabel)
    }
    cell.tag = 19
    return cell
}

我使用的自定义单元格MatchCollectionViewCell只包含一个标签matchCollectionLabel,就是这样。我在视图的viewDidAppear函数中使用self.matchCollectionView.reloadData(),以便在辅助视图更改表并关闭回原始视图时。

我在第一次使用后标记了单元格,在每次viewDidAppear之后,我都不会不断地向单元格添加不必要的子视图。

在初始设置之后,该表看起来很棒,但在调用reloadData之后,collectionView的单元格顺序会发生变化并混乱。如果我编辑单元格数,则reloadData()更新以正确显示单元格编号更改但单元格仍然处于错误的顺序。

这是reloadData之前和之后的图片

http://imgur.com/wqfXqLG.png

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

您每次都在创建新标签。如果标签不是19,则只将其添加为子视图,但始终分配新标签。

这意味着当您重复使用单元格时,您正在更新新标签,而不是已添加到单元格中的标签,因此您的更改不可见。

您可以将标记检查移动到函数顶部,并使用它来控制标签的分配,或将matchCollectionLabel定义为可选项,然后您可以检查nil

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let reuseIdentifier = "MatchCollectionViewCell"
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MatchCollectionViewCell

    if cell.matchCollectionLabel == nil {
        cell.matchCollectionLabel = UILabel(frame: CGRectMake(0,0,collectionView.bounds.width/3 - 3.0,15))
        cell.matchCollectionLabel!.textColor = UIColor.blackColor()
        cell.systemLayoutSizeFittingSize(cell.frame.size, withHorizontalFittingPriority: UILayoutPriorityDefaultHigh, verticalFittingPriority: UILayoutPriorityDefaultLow)
        cell.matchCollectionLabel!.font = UIFont(name: "Helvetica Neue", size:12)
        cell.addSubview(cell.matchCollectionLabel!)
    }

    if indexPath.section == 0 {
        switch indexPath.row {
        case 0:
            cell.matchCollectionLabel!.text = "Match #"
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Right
            break
        case 1:
            cell.matchCollectionLabel!.text = "Record"
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Center
            break
        case 2:
            cell.matchCollectionLabel!.text = "Outcome"
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            break
        default:
            cell.matchCollectionLabel!.text = ""
            cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            break
        }
    } else {
        switch indexPath.row {
        case 0:
            cell.matchCollectionLabel!.text = "\(indexPath.section)"
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Right
            break
        case 1:
            cell.matchCollectionLabel!.text = matchesFromSelectedSession[indexPath.section - 1].matchRecord()
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Center
            break
        case 2:
            let outcome = matchesFromSelectedSession[indexPath.section - 1].matchOutcome()
            switch outcome {
            case "W":
                cell.matchCollectionLabel!.text = "Win"
                cell.matchCollectionLabel!.textColor = UIColor.greenColor()
                break
            case "D":
                cell.matchCollectionLabel!.text = "Draw"
                cell.matchCollectionLabel!.textColor = UIColor.blueColor()
                break
            case "L":
                cell.matchCollectionLabel!.text = "Loss"
                cell.matchCollectionLabel!.textColor = UIColor.redColor()
                break
            default:
                cell.matchCollectionLabel!.textColor = UIColor.blackColor()
                break
            }
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            break
        default:
            if indexPath.section%2 == 0 {
                cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
            }
            cell.matchCollectionLabel!.text = ""
            break
        }
    }
    return cell
}