Ios 为什么我的if字符串==else if!=语句仅适用于数组中的最后一个值?

Ios 为什么我的if字符串==else if!=语句仅适用于数组中的最后一个值?,ios,swift,Ios,Swift,我有一个每月日历集合视图和一个xml,我正在解析它以获取一些日期。我试图在calendarview上用边框显示这些日期,但遇到了一个我不确定如何调试的问题-不是xml中的日期也会在其周围显示边框,然后在滚动到下个月并返回时随机更改,如下所示- 这是我现在设置边框的代码。是否有明显的错误或遗漏 //Mark: Configure Calendar Cell func configureCalendarCell(cell: JTAppleCell?, cellState: CellState) {

我有一个每月日历集合视图和一个xml,我正在解析它以获取一些日期。我试图在calendarview上用边框显示这些日期,但遇到了一个我不确定如何调试的问题-不是xml中的日期也会在其周围显示边框,然后在滚动到下个月并返回时随机更改,如下所示-

这是我现在设置边框的代码。是否有明显的错误或遗漏

//Mark: Configure Calendar Cell
func configureCalendarCell(cell: JTAppleCell?, cellState: CellState) {
    guard let myCustomCell = cell as? CalendarCell else { return }

    //configure functions including:
    getEventDates(cell: myCustomCell, cellState: cellState)
}

//Mark: set events from XML == selected cell from Calendar
func getEventDates(cell: CalendarCell, cellState: CellState) {

        for calendarDate in tableViewDataSource {
            let datesFromCalendarXML = calendarDate.date
            //print("Found \(datesFromCalendarXML)") This prints dates parsed from XML file - See picture 1 below

            let visibleDatesToString = formatter.string(from: cellState.date)
            //print("Visible dates \(visibleDatesToString)") This prints all of the dates in the current month showing. So for September, it shows all of the dates in September. See picture 2 below

            // If there is a date match, then show a round blue border
            if datesFromCalendarXML == visibleDatesToString {

                cell.dateLabel.layer.cornerRadius = 25
                cell.dateLabel.layer.borderWidth = 3
                cell.dateLabel.layer.borderColor = UIColor.blue.cgColor
                cell.dateLabel.clipsToBounds = true

            // If there is no date match, show no border. I had set this to UIColor.clear.cgColor but then only the last datesFromCalendarXML Oct 30 showed as a blue, so I changed it to red and saw that random dates including the ones from the XML are being circled red.
            } else if datesFromCalendarXML != visibleDatesToString {
                cell.dateLabel.layer.borderColor = UIColor.red.cgColor
                cell.dateLabel.clipsToBounds = true
            }
}
}
}

//Mark: CalendarView Delegate
extension CalendarViewController: JTAppleCalendarViewDelegate {

func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {
    let cell = calendar.dequeueReusableJTAppleCell(withReuseIdentifier: "CalendarCell", for: indexPath) as! CalendarCell
    cell.dateLabel.text = cellState.text
    configureCalendarCell(cell:cell, cellState: cellState)
    return cell
}
}
这似乎只适用于datesFromCalendarXML中的最后一个值,因为10月30日用蓝色环显示u p。XML中的其他值,9月1日、10日、20日和10月1日、10日、20日,与其他随机日期一样,显示为红圈

在//printFound datesFromCalendarXML的我的控制台中-

在//打印可见日期visibleDatesToString的我的控制台中-

增加:

我试着将日期标签的颜色改为绿色,不管出于什么原因,这只会使匹配的日期变为绿色,而不会随机添加其他绿色日期。我不知道为什么我可以更改dateLabel.textColor而不是背景-


在configureCalendarCell中,您每次都在创建单元格。相反,您可以使用dequeueReusableCell,它实际上重用您创建的单元格,只需更新新数据即可。这是CollectionView的主要优点

let cell =  collectionView.dequeueReusableCell(withReuseIdentifier: "TDCheckMarkLabelCollectionViewCell", for: indexPath)

首先,必须在脚本或XIB中为单元格设置唯一标识符。

问题在于逻辑

对于tableViewDataSource{}中的calendarDate

calendarDate始终循环以填充红色背景

假设你在约会10,你的xml是:10,20,30

当日期10勾选时,它会循环填充背景蓝色,然后是红色,然后是红色

因此,如果datesFromCalendarXML==visibleDatesToString{},则使用break-inside,这样它将在填充蓝色背景后停止

其他答案中的一个几乎得到它。。。您正在按预期使用dequeueReusableCell。然而,你忘记或没有意识到这意味着你在重复使用细胞!这意味着,有时您会得到一个已设置为显示边框的单元格,并使用它显示一个不应显示边框的单元格。由于您的函数假定单元格没有边框,因此它不会对单元格执行任何操作,并且由于单元格已经有边框,因此它会显示边框

有两种方法可以解决这个问题

在单元格内,可以重写prepareForReuse方法并删除单元格上可能存在的任何圆

完成getEventDates函数中的逻辑。您的逻辑并没有说明对于一个既没有红色边框也没有蓝色边框的单元格应该发生什么,但是当前恰好有一个边框


您是否将可重复使用的JTAppleCell退出队列?如果是这样,那就解释了。@DanielT是的,我把它放在cellForItemAt方法里了,谢谢。我的cellForRowAt方法中已经有了这个。我没有把它添加到我原来的帖子中,因为我忘记了它的相关性。我现在已经添加了它。我已经设置了一个单元重用标识符。您的问题是否已修复?否,未修复。我的意思是,我的代码中已经有了这一部分,但在最初的帖子中没有分享这一部分。原来的问题仍然存在。我已经为我的collectionView提供了cellForItemAt、didSelectDate和DidDecelectDate方法。您是否看到了可能导致我的问题的任何东西?我想澄清一下:我的XML日期是9月1日、10日、20日、10月1日、10日、30日,10月30日将变为蓝色。所以最后一个日期是蓝色的,而不是第一个-这和你解释的原因相同?我希望所有xml日期都是蓝色的。另外,您看到我在哪里更改dateLabel.textColor=UIColor.green了吗。你知道为什么这样做有效而背景色不起作用吗?我还发现日期周围的红色边框没有被选中,也没有出现在我的XML中。为什么会这样?为什么一个月的装载量都是随机的这是正确的答案。你甚至不应该在这个方法中有一个循环。一个单元格代表一个日期,但您正在循环遍历每个单元格的所有日期。感谢Daniel的解释。我还是有点困惑。我以为我已经完成了getEventDates中的逻辑。只有两个选项-如果datesFromCalendarXML==visibleDatesToString,则日期匹配,在这种情况下,将其变为蓝色,或者日期与datesFromCalendarXML不匹配!=visibleDatesToString,在这种情况下,将其变为红色。我最初将其设置为“清晰”,而不是使其消失的红色。然而,我的问题是,应该匹配的日期并不都显示为蓝色边框,只有最后一个显示为蓝色边框。Cont'dMy XML日期为9月1日、10日、20日、10月1日、10日、30日,10月30日为蓝色。我只在日期与CalendarXML中的日期不匹配时才打开VisibleDate将字符串从“清除”改为“红色”,以查看可能发生的情况。
let cell =  collectionView.dequeueReusableCell(withReuseIdentifier: "TDCheckMarkLabelCollectionViewCell", for: indexPath)