Работа с календарем. Github проект


#1

Как выделить красным индикатором только определенные даты в календаре и чтобы при нажатии у каждой выделенной даты появлялся свой alertController?
Ссылка на github проект


#2

Скачайте проект с гитхаба и поройтесь в исходниках. Придет понимание как он устроен и как это сделать


#3

Как устроен понимание есть, но все мои длинные способы перепробовал, не получается к сожалению.


#4

Ну ваши красные кружочки должны быть приблизительно в методе аналогичном cellForRow

А нажатие следует искать в didSelectRow


#5

В этом методе в cell.eventView.isHidden = false, меняя значение я устанавливаю eventView в будние дни, аналогичное действие происходит с выходными днями. Не могу в толк взять как установить eventView для определенных дней. Задача для меня усложняется еще тем что 12 месяцев в году и в каждом месяце разные дни должны быть отмечены eventView.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = DateCollectionViewCell.cellForCollectionView(collectionView: collectionView, indexPath: indexPath)

    if indexPath.item <= firstWeekDayOfMonth - 2 {
        cell.isHidden = true
        return cell

    } else {

        let calcDate = indexPath.row-firstWeekDayOfMonth+2
        cell.isHidden = false
        cell.dateLabel.textColor = #colorLiteral(red: 0.5568627451, green: 0.3568627451, blue: 0.6156862745, alpha: 1)
        cell.dateLabel.text = "\(calcDate)"

        if let date = String.dateFormatter.date(from: "\(currentYear)-\(currentMonthIndex+1)-\(calcDate)") {
            

            if date.isWeekend() { // Disable the cell if its a weekend
                cell.isUserInteractionEnabled = false
                cell.backgroundImageView.image = #imageLiteral(resourceName: "bg_date_dark")
                cell.dateLabel.textColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
                cell.eventView.isHidden = false

            } else { // enable cell for weekdays
                cell.isUserInteractionEnabled = true
                cell.backgroundImageView.image = #imageLiteral(resourceName: "bg_date_light")
                cell.dateLabel.textColor = #colorLiteral(red: 0.5568627451, green: 0.3568627451, blue: 0.6156862745, alpha: 1)
                cell.eventView.isHidden = false
            }
        }

#6

В кратце: допустим у вас есть список дат, в которых нужно вставить красный маркер. Вы для конкретного месяца проверяете каждую ячейку, берете от туда день, переводите в формат даты и ищете эту дату в своем списке. Если такая дата нашлась, вставляете свой маркер.


#7

Я использую конструкцию if

Есть эти данные:

var months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]
    var numOfDaysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]
    var currentMonthIndex: Int = 0
    var currentYear: Int = 0
    var presentMonthIndex = 0
    var presentYear = 0
    var todaysDate = 0
    var firstWeekDayOfMonth = 0   //(Sunday-Saturday 1-7)

if months[8] == months[8] && todaysDate == 17 {
                    
    cell.eventView.isHidden = false
}

но в данном случае, в зависимости от условия, eventView отображается на всех датах.

Как добраться до самой ячейки с указанной датой?


#8

cell это и есть ваша ячейка с датой. Судя по коду cell.eventView это красный индикатор.
Попробуйте сделать так для проверки

} else { // enable cell for weekdays
    cell.isUserInteractionEnabled = true
    cell.backgroundImageView.image = #imageLiteral(resourceName: "bg_date_light")
    cell.dateLabel.textColor = #colorLiteral(red: 0.5568627451, green: 0.3568627451, blue: 0.6156862745, alpha: 1)
    if (currentMonthIndex == 9 && todaysDate == 17) {
        cell.eventView.isHidden = false
    } else {
        cell.eventView.isHidden = true
    }
}

#9

Та же картина. Отмечаются все даты.


#10

Посмотрите через дебаггер, попадает ли он во второе условие где должно быть true


#11

Не понятно. Но Сейчас eventView устанавливается только в тот месяц чей индекс указываю. А вот число не воспринимает. Точнее воспринимает, но таким образом:
если месяц сентябрь и дата 17 {
то устанавливается eventView на все дни месяца
}
если установлю дату 18 то eventView не будет установлен

надо что бы только 17 число было отмечено, или 18 число или оба вместе
вообщем eventView должен буть установлен только на те даты, которые я укажу


#12

Данное решение ставит eventView в одну ячейку по указанному indexPath.item )))

if (currentMonthIndex == 8 && indexPath.item == 22) {
    cell.eventView.isHidden = false
} else {
    cell.eventView.isHidden = true
}

Теперь не получается установить eventView в две ячейки


#13

Все. Я реши задачу с eventView).

if let date = String.dateFormatter.date(from: “(currentYear)-(currentMonthIndex+1)-(calcDate)”) {

            if (currentMonthIndex == 8 && indexPath.item == 22) {
                cell.eventView.isHidden = false
            }
            
            if (currentMonthIndex == 8 && indexPath.item == 23) {
                cell.eventView.isHidden = false
            }
            
            
            if date.isWeekend() { // Disable the cell if its a weekend
                cell.isUserInteractionEnabled = false
                cell.backgroundImageView.image = #imageLiteral(resourceName: "bg_date_dark")
                cell.dateLabel.textColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
                cell.eventView.isHidden = true
                
            } else { // enable cell for weekdays
                cell.isUserInteractionEnabled = true
                cell.backgroundImageView.image = #imageLiteral(resourceName: "bg_date_light")
                cell.dateLabel.textColor = #colorLiteral(red: 0.5568627451, green: 0.3568627451, blue: 0.6156862745, alpha: 1)
            }
        }

#14

Боже, какой я глупый, я перепутал переменные, нужно проверять indexPath.item, а не todaysDate.
Как обычно думал правильно, а написал нет.
Рад что сами дошли до этого.
Советую сделать функцию, которая будет принимать текущий месяц и ячейку с датой, а в функции будет проверяться помечать дату или нет.