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

时间:2018-09-25 01:01:24

标签: ios swift

我有一个每月的日历收集视图和一个要解析的XML,以获取一些日期。我正在尝试在Calendarview上显示带有边框的日期,但遇到一个不确定的问题,即我不确定如何调试-并非来自xml的日期也会显示带有边框,然后在滚动至时会随机更改下个月又回来了-https://imgur.com/a/mxyUtJe

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

//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
}
}

这似乎仅适用于dateFromCalendarXML中的最后一个值,因为10月30日显示带有蓝色环的u p。 XML中的其他值,9月1日,10日,20日和10月1日,10日,20日与其他随机日期一样,都带有红色环。

在我的控制台中// // print(“ Found(datesFromCalendarXML)”-https://i.stack.imgur.com/dYlYL.png

在我的控制台中// print(“可见日期(visibleDatesToString)”)-https://i.stack.imgur.com/sbRtA.png

已添加:

我试图将datelabel的颜色更改为绿色,无论出于何种原因,它只能使匹配的日期变为绿色,而不会随机添加其他绿色日期。我不知道为什么可以更改dateLabel.textColor而不更改背景-https://imgur.com/a/St3b8ND

if datesFromCalendarXML == visibleDatesToString {
                cell.dateLabel.textColor = UIColor.green

            } else if datesFromCalendarXML != visibleDatesToString {

            }

3 个答案:

答案 0 :(得分:1)

问题是您的逻辑

对于tableViewDataSource {}中的calendarDate

calendarDate总是循环填充红色背景

假装您在日期10,而您的xml是:10,20,30

检查日期10时,它会循环填充蓝色,红色,红色的背景

因此,如果datesFromCalendarXML == visibleDatesToString {},请在内部使用break,以便在填充蓝色backgrund后它将停止

答案 1 :(得分:0)

在configureCalendarCell中,您每次都在创建单元。取而代之的是,您可以使用dequeueReusableCell,它实际上重用您创建的单元格并只是向其中更新新数据。这是CollectionView的主要优点。

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

首先,您必须在情节提要或XIB中为单元格设置唯一标识符。

答案 2 :(得分:0)

几乎的其他答案之一...您正在按预期的方式使用dequeueReusableCell。但是,您忘记了或没有意识到这意味着您正在重用单元格!这意味着有时您会得到一个已经设置为显示边框的单元格,并使用它来显示不应该显示边框的单元格。由于您的函数假定该单元格没有边框,因此它对该单元格没有任何作用,并且由于该单元格已经具有边框,因此显示带有边框。

有两种方法可以解决此问题。

  1. 在单元格内部,您可以覆盖prepareForReuse方法并删除该单元格上可能存在的任何圆圈。

  2. 完成getEventDates函数中的逻辑。您的逻辑并没有说一个没有红色或蓝色边框但当前恰好有一个边框的单元会发生什么情况。