swift CollectionView中的像元丢失属性

bpzcxfmw  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(159)

我有一个集合视图,其中的单元格在屏幕上显示设备状态。通过调整单元格的alpha值,缺货的设备将显示为灰色。但当我在屏幕上滚动或点击任何单元格时,单元格将重新加载并丢失设置。代码如下:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "MyCollectionViewCell", for: indexPath) as! MyCollectionViewCell
        self.allDevices = self.allDevices.sorted(by: {$0.givenName.lowercased() < $1.givenName.lowercased()})
    
    DispatchQueue.main.async {
        let deviceSKU = self.allDevices[indexPath.row].name
        let deviceName = self.allDevices[indexPath.row].givenName
        var alphaValue = 1.0
        var enableValue = true
        if self.allDevices[indexPath.row].connectFlag != nil {
            alphaValue = (self.allDevices[indexPath.row].connectFlag == "1") ? 1.0 : 0.2
            enableValue = (self.allDevices[indexPath.row].connectFlag == "1") ? true : false
        }

        if deviceSKU == "STS001" {
            let deviceImage = (self.allDevices[indexPath.row].state == true) ? UIImage(named: "socket-green.png") : UIImage(named: "socket-red.png")
            cell.configure(with: deviceImage!, name: deviceName, offline: alphaValue, enabled: enableValue)
        }
        if deviceSKU == "DWS01" {
            let deviceImage = (self.allDevices[indexPath.row].state == true) ? UIImage(named: "door-close2.png") : UIImage(named: "door-open2.png")
                    cell.configure(with: deviceImage!, name: deviceName, offline: alphaValue, enabled: enableValue)
            
        }
        
        if deviceSKU == "BWS01" {
            let deviceImage = (self.allDevices[indexPath.row].state == true) ? UIImage(named: "wallsocket-on.png") : UIImage(named: "wallsocket-off.png")
            cell.configure(with: deviceImage!, name: deviceName, offline: alphaValue, enabled: enableValue)
            
        }
        
        if deviceSKU == "5CHN" {
            let deviceImage = UIImage(named: "5Channel.png")
            cell.configure(with: deviceImage!, name: deviceName, offline: alphaValue, enabled: enableValue)
            
        }

    }
    
        return cell
    
 }

UICollectionViewCell文件中的cell.configure函数:

public func configure(with image: UIImage, name: String, offline : CGFloat, enabled : Bool){
    deviceImage.image = image
    deviceName.text = name
    self.alpha = offline
    self.isUserInteractionEnabled = enabled
}

我还将cell.userInteractionEnabled标记为false,但保留了此设置,但cell.alpha设置正在丢失。当加载数据时,最初显示为灰色的单元格,每当我单击屏幕上允许用户交互的任何单元格或滚动时,这些特定单元格将返回正常可见状态,并且当它们开始重新加载alpha = 1时,这些特定单元格将离开可见区域。

y53ybaqx

y53ybaqx1#

因为单元格被重用,所以必须在所有可能的情况下设置状态,而不是在所有if语句都为假的情况下重置状态。
最好的方法是覆盖自定义单元格类中的prepareForReuse()函数。

override func prepareForReuse() {
    super.prepareForReuse()

    deviceImage.image = nil
    deviceName.text = ""
    self.alpha = 1
    self.isUserInteractionEnabled = true    
}

根据需要调整代码。我基于您在configure方法中所做的工作来调整这些行。
这确保了每个单元在cellForItemAt中出队之后被重置为新状态。

相关问题