iOS电子表格视图无法在单元格中显示多个块

问题描述

我正在使用 Spreadsheetview 库来展示案例 Jobber 功能。 有一个关键问题阻碍了项目的发布。这在下面提到:

问题:无法在自定义单元格中显示多块内容

场景:假设用户 A 从上午 10:00 到上午 12:00 有任务 1,用户 B 从上午 10:00 到上午 11:00 有任务 2,用户 C 从上午 10:00 到上午 12:00 有任务 3 11:30 AM 所以这三个任务应该一个一个显示在合并的单元格中。

参考下面的截图。

Screenshot

代码

func spreadsheetView(_ spreadsheetView: SpreadsheetView,cellForItemAt indexPath: IndexPath) -> Cell? {

        if self.jobDetails == nil {
            return nil
        }
. . . 

//other cases handled like displaying time,date,visit person name which is not having any issue
. . .

else if case (1...(calenderData.count + 1),2...(Constants.timeIntervals.count + 1)) = (indexPath.column,indexPath.row) {

 let cell = spreadsheetView.dequeueReusableCell(withReuseIdentifier: String(describing: ScheduleCell1.self),for: indexPath) as! ScheduleCell1
            if(cell.firstBlockLabel.text != nil) || (cell.secondBlockLabel.text != nil) || (cell.thirdBlockLabel.text != nil) {
                return nil
            }

let visits = calenderData[indexPath.column - 1].calendarRows
            for visit in visits {
                let diff = findTimeDifference(firstTime: cellTime,secondTime: visit.startTime)
                print("startTime: \(visit.startTime) endTime \(visit.endTime) title \(visit.title) totalBlocks \(visit.totalBlocks)")
                
                if(diff >= -30 && diff <= 30 && diff != -1) {
                    switch visit.totalBlocks {
                    case 0,1:
                        cell.firstBlockLabel.isHidden = false
                        cell.secondBlockLabel.isHidden = true
                        cell.thirdBlockLabel.isHidden = true
                        
                        cell.firstBlockLabel.text = "1 - case 1"
                        if visit.blockSerialNo == 1 {
                            if(visit.statusCode.caseInsensitiveCompare("completed") == .orderedSame){
                                cell.firstBlockLabel.attributedText = "\(visit.title)".strikeThrough()
                            } else {
                                cell.firstBlockLabel.text = "\(visit.title)"
                            }
                            
                            cell.firstBlockLabel.backgroundColor = hexStringToUIColor(hex: visit.statusTagProp.background)
                            cell.firstBlockLabel.textColor = hexStringToUIColor(hex: visit.statusTagProp.text)
                        }
                    case 2:
                        cell.firstBlockLabel.isHidden = false
                        cell.secondBlockLabel.isHidden = false
                        cell.thirdBlockLabel.isHidden = true
                        
                        cell.firstBlockLabel.text = "1 - case 2"
                        cell.secondBlockLabel.text = "2 - case 2"
                        
                        if visit.blockSerialNo == 2 {
                            if(visit.statusCode.caseInsensitiveCompare("completed") == .orderedSame){
                                cell.secondBlockLabel.attributedText = "\(visit.title)".strikeThrough()
                            } else {
                                cell.secondBlockLabel.text = "\(visit.title)"
                            }
                            
                            cell.secondBlockLabel.backgroundColor = hexStringToUIColor(hex: visit.statusTagProp.background)
                            cell.secondBlockLabel.textColor = hexStringToUIColor(hex: visit.statusTagProp.text)
                        }
                    case 3:
                        cell.firstBlockLabel.isHidden = false
                        cell.secondBlockLabel.isHidden = false
                        cell.thirdBlockLabel.isHidden = false
                        
                        cell.firstBlockLabel.text = "1 - case 3"
                        cell.secondBlockLabel.text = "2 - case 3"
                        cell.thirdBlockLabel.text = "3 - case 3"
                        
                        if visit.blockSerialNo == 3 {
                            if(visit.statusCode.caseInsensitiveCompare("completed") == .orderedSame){
                                cell.thirdBlockLabel.attributedText = "\(visit.title)".strikeThrough()
                            } else {
                                cell.thirdBlockLabel.text = "\(visit.title)"
                            }
                            
                            cell.thirdBlockLabel.backgroundColor = hexStringToUIColor(hex: visit.statusTagProp.background)
                            cell.thirdBlockLabel.textColor = hexStringToUIColor(hex: visit.statusTagProp.text)
                        }
                    default:
                        break
                    }

break
                }
            }
            return cell
}
        return nil
    }



class ScheduleCell1: Cell {
    let firstBlockLabel = UILabel()
    let secondBlockLabel = UILabel()
    let thirdBlockLabel = UILabel()
    let stackview = UIStackView()
    
    let lineLabel = UILabel()
    var lineYPosition: Int = 0
    
   override var frame: CGRect {
        didSet {
            firstBlockLabel.frame = CGRect(x: 0,y: 0,width: 500,height: 500)
            secondBlockLabel.frame = CGRect(x: 0,height: 500)
            thirdBlockLabel.frame = CGRect(x: 0,height: 500)
            
            lineLabel.frame = bounds.insetBy(dx: 0,dy: 0)
            lineLabel.frame = CGRect(x: 0,y: lineYPosition,width: 300,height: 1)
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        lineLabel.frame = bounds
        lineLabel.backgroundColor = .red
        
        firstBlockLabel.textAlignment = .center
        //firstBlockLabel.text = "firstBlockLabel"
        firstBlockLabel.numberOfLines = 0
        firstBlockLabel.lineBreakMode = .byTruncatingTail
        firstBlockLabel.translatesAutoresizingMaskIntoConstraints = false
        
        secondBlockLabel.textAlignment = .center
        //secondBlockLabel.text = "secondBlockLabel"
        secondBlockLabel.numberOfLines = 0
        secondBlockLabel.lineBreakMode = .byTruncatingTail
        secondBlockLabel.translatesAutoresizingMaskIntoConstraints = false
        
        thirdBlockLabel.textAlignment = .center
        //thirdBlockLabel.text = "thirdBlockLabel"
        thirdBlockLabel.numberOfLines = 0
        thirdBlockLabel.lineBreakMode = .byTruncatingTail
        thirdBlockLabel.translatesAutoresizingMaskIntoConstraints = false
        
        stackview.frame = bounds
        stackview.axis = .horizontal
        stackview.spacing = .leastNonzeroMagnitude
        stackview.contentMode = .scaletoFill
        stackview.translatesAutoresizingMaskIntoConstraints = false
        stackview.alignment = .fill
        stackview.distribution = .fill
        stackview.distribution = .fillProportionally
        
        stackview.addArrangedSubview(firstBlockLabel)
        stackview.addArrangedSubview(secondBlockLabel)
        stackview.addArrangedSubview(thirdBlockLabel)
        
        firstBlockLabel.backgroundColor = .yellow
        secondBlockLabel.backgroundColor = .purple
        thirdBlockLabel.backgroundColor = .green
        stackview.backgroundColor = .magenta
        //contentView.backgroundColor = .magenta
        
        contentView.addSubview(lineLabel)
        contentView.bringSubviewToFront(lineLabel)
        contentView.addSubview(stackview)
        
        stackview.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
        stackview.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

所以我添加了两个属性 totalBlocks(确定要显示多少块)和 BlockSrNo(确定块的序列号)。其逻辑如下:

func determineMultiBlocks() {
        for data in calenderData {
            let visits = data.calendarRows

for var i in 0..<visits.count {
                let visit = visits[i]
                
                for var j in (i+1)..<visits.count {
                    let nextVisit = visits[j]

let timeOverlapExists = CheckIfTimeExistBetweenTwoTimeInterval(withStartTime: visit.startTime.timeInSeconds,withEndTime: visit.endTime.timeInSeconds,withTimetocheck: nextVisit.startTime.timeInSeconds)

if timeOverlapExists {

visit.totalBlocks = visit.totalBlocks + 1
                        nextVisit.totalBlocks = 0 //nextVisit.totalBlocks - 1
                        nextVisit.blockSerialNo = visit.totalBlocks
                        
                        j = j + 1
}
                }
break
            }

能帮我看看哪里出错了吗?如果有任何其他解决方案而不是使用 totalBlocks/blockSerialNo,请告诉我。

感谢所有解决方案!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)