微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift CVCalendar不更新monthLabel

如何解决Swift CVCalendar不更新monthLabel

我最近开始使用CVCalendar创建带有Week演示文稿的CalendarView。

我创建了一个名为UILabel的{​​{1}},它具有视图控制器的出口

enter image description here

此特定视图的ViewController是这样的:

monthLabel

出口参考:

enter image description here

这里的问题是,即使我告诉UILabel每当显示的日期更新时也要更改其文本:

import UIKit
import CVCalendar

class EventsViewController: UIViewController {
    @IBOutlet weak var headerView: UIView!
    @IBOutlet weak var menuView: CVCalendarMenuView!
    @IBOutlet weak var calendarView: CVCalendarView!
    @IBOutlet weak var eventsTable: UITableView!
    @IBOutlet weak var monthLabel: UILabel!
    
    private var currentCalendar: Calendar?
    private var animationFinished: Bool = true
    
    let mainAppViewHeader: MainAppViewHeader = UIView.fromNib()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        loadViewHeader()
        setupTable()
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        setupDatePicker()
    }
    
    override func awakeFromNib() {
        let timeZoneBias = 480 // (UTC+08:00)
        currentCalendar = Calendar(identifier: .gregorian)
        currentCalendar?.locale = Locale(identifier: "fr_FR")
        if let timeZone = TimeZone(secondsFromGMT: -timeZoneBias * 60) {
            currentCalendar?.timeZone = timeZone
        }
    }
    
    func setupDatePicker() {
        menuView.delegate = self
        calendarView.delegate = self
        
        menuView.backgroundColor = ColorManager.Gray5
        calendarView.backgroundColor = ColorManager.Gray5
        
        calendarView.appearance.dayLabelPresentWeekdaySelectedBackgroundColor = ColorManager.PrimaryColor
        calendarView.appearance.dayLabelWeekdaySelectedBackgroundColor = ColorManager.PrimaryColor
        
        if let currentCalendar = currentCalendar {
            monthLabel.text = CVDate(date: Date(),calendar: currentCalendar).globalDescription
        }
        
        menuView.commitMenuViewUpdate()
        calendarView.commitCalendarViewUpdate()
    }
    
    func loadViewHeader() {
        mainAppViewHeader.setupHeader()
        headerView.addSubview(mainAppViewHeader)
    }
    
    func setupTable() {
        let rowNib = UINib(nibName: "EventTableCell",bundle: nil)
        
        eventsTable.dataSource = self
        eventsTable.delegate = self
        
        eventsTable.register(rowNib,forCellReuseIdentifier: "eventCell")
        eventsTable.separatorStyle = .none
    }
}

extension EventsViewController: CVCalendarViewDelegate,CVCalendarMenuViewDelegate {
    func presentationMode() -> CalendarMode {
        return .weekView
    }
    
    func firstWeekday() -> Weekday {
        return .sunday
    }
    
    func shouldAutoSelectDayOnWeekChange() -> Bool {
        return true
    }
    
    func disableScrollingBeforeDate() -> Date {
        let currentDate = Date()
        return currentDate.addingTimeInterval(-8 * 24 * 60 * 60)
    }
    
    func disableScrollingBeyondDate() -> Date {
        let currentDate = Date()
        return currentDate.addingTimeInterval(180 * 24 * 60 * 60)
    }
    
    func maxSelectableRange() -> Int {
        return 1
    }
    
    func shouldSelectRange() -> Bool {
        false
    }
    
    func earliestSelectableDate() -> Date {
        let currentDate = Date()
        return currentDate.addingTimeInterval(-8 * 24 * 60 * 60)
    }
    
    func latestSelectableDate() -> Date {
        let currentDate = Date()
        return currentDate.addingTimeInterval(180 * 24 * 60 * 60)
    }
    
    func shouldShowWeekdaysOut() -> Bool {
        return true
    }
    
    func didShowPrevIoUsWeekView(from startDayView: DayView,to endDayView: DayView) {
        print(startDayView,endDayView)
    }
    
    func presentedDateUpdated(_ date: CVDate) {
        monthLabel.text = "asdf" //calendarView.presentedDate.globalDescription
        print(date.globalDescription)
    }
}

extension EventsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return 3
    }
    
    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let eventCell = tableView.dequeueReusableCell(withIdentifier: "eventCell") as? EventTableCell else {
            return UITableViewCell()
        }
        
        eventCell.setupCell()
        eventCell.updateConstraintsIfNeeded()
        
        return eventCell
    }
}

extension EventsViewController: UITableViewDelegate {
    
}

它没有更新其值,但是我在控制台中打印了func presentedDateUpdated(_ date: CVDate) { monthLabel.text = "asdf" //calendarView.presentedDate.globalDescription print(date.globalDescription) } 值。

尝试更新标签时是否缺少某些内容

我尝试使用official example中的代码

date.globalDescription

但是这种方法只会在更新的月份后推送一个新视图,然后关闭该视图,并且它包含与我使用的基本相同的代码

func presentedDateUpdated(_ date: CVDate) {
    if monthLabel.text != date.globalDescription && self.animationFinished {
        let updatedMonthLabel = UILabel()
        updatedMonthLabel.textColor = monthLabel.textColor
        updatedMonthLabel.font = monthLabel.font
        updatedMonthLabel.textAlignment = .center
        updatedMonthLabel.text = date.globalDescription
        updatedMonthLabel.sizetoFit()
        updatedMonthLabel.alpha = 0
        updatedMonthLabel.center = self.monthLabel.center
        
        let offset = CGFloat(48)
        updatedMonthLabel.transform = CGAffineTransform(translationX: 0,y: offset)
        updatedMonthLabel.transform = CGAffineTransform(scaleX: 1,y: 0.1)
        
        UIView.animate(withDuration: 0.35,delay: 0,options: UIView.Animationoptions.curveEaseIn,animations: {
            self.animationFinished = false
            self.monthLabel.transform = CGAffineTransform(translationX: 0,y: -offset)
            self.monthLabel.transform = CGAffineTransform(scaleX: 1,y: 0.1)
            self.monthLabel.alpha = 0
            
            updatedMonthLabel.alpha = 1
            updatedMonthLabel.transform = CGAffineTransform.identity
            
        }) { _ in
            
            self.animationFinished = true
            self.monthLabel.frame = updatedMonthLabel.frame
            self.monthLabel.text = updatedMonthLabel.text
            self.monthLabel.transform = CGAffineTransform.identity
            self.monthLabel.alpha = 1
            updatedMonthLabel.removeFromSuperview()
        }
        
        self.view.insertSubview(updatedMonthLabel,aboveSubview: self.monthLabel)
    }
}

self.monthLabel.text = updatedMonthLabel.text 尚未更新,这是使用上面的代码时发生的情况,它恢复为原始文本。

enter image description here

如果我删除此行:

monthLabel

两个文本都重叠,因此忽略了这一行:

updatedMonthLabel.removeFromSuperview()

enter image description here


我做了一些额外的测试,并检查了标签是否与视图的出口正确链接,我更改了文字颜色:

self.monthLabel.text = updatedMonthLabel.text

它打印:

func presentedDateUpdated(_ date: CVDate) {
        print(Thread.current)
        print("Wololo")
        monthLabel.textColor = UIColor.green
        monthLabel.text = "asdf"
//        calendarView.contentController.refreshPresentedMonth()
//        monthLabel.text = "asdf" //calendarView.presentedDate.globalDescription
//        print(date.globalDescription)
    }

我无数次通过单击日历更改日期,但文本保持不变:

enter image description here

解决方法

由于某些原因,其中的代码:

override func awakeFromNib() {
    let timeZoneBias = 480 // (UTC+08:00)
    currentCalendar = Calendar(identifier: .gregorian)
    currentCalendar?.locale = Locale(identifier: "fr_FR")
    if let timeZone = TimeZone(secondsFromGMT: -timeZoneBias * 60) {
        currentCalendar?.timeZone = timeZone
    }
}

如果我们删除上面的代码而改为不这样做,则会与不更新标签发生冲突:

func setupDatePicker() {
    menuView.delegate = self
    calendarView.delegate = self
    
    menuView.commitMenuViewUpdate()
    calendarView.commitCalendarViewUpdate()
    
    monthLabel.text = calendarView.presentedDate.globalDescription //This line at the bottom of this method
}

一切再次正常。

如果有人知道其背后的原因,请随时发表评论,我将其添加到答案中。

,

presentedDateUpdated可能是在后台线程上调用的,因此不会显示UI更改。您可以通过在Thread.current内打印presentedDateUpdated来确认。

一个简单的解决方案是:

func presentedDateUpdated(_ date: CVDate) {
    DispatchQueue.main.async { [weak self] in
        self?.monthLabel.text = "asdf" //calendarView.presentedDate.globalDescription
        print(date.globalDescription)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。