You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FSCalendar中设置可点击的上一页/下一页按钮?

实现FSCalendar添加上下页切换按钮的方案

我之前做项目的时候正好实现过这个需求,给你分享几个靠谱的实现方式,都是直接用FSCalendar自带的API,不用绕弯路:

基础实现:直接调用内置切换方法

这是最简洁的方案,只需要给按钮绑定点击事件,调用FSCalendar的setCurrentPage(_:animated:)方法就能完成月份切换:

  1. 先在界面上添加按钮:
    在你的日历所在的ViewController的xib/storyboard里,添加两个UIButton(比如命名为“上一页”和“下一页”),放在日历的合适位置(比如左右两侧或者顶部)。

  2. 关联控件并绑定点击事件:
    假设你已经有了FSCalendar的实例,代码示例(Swift):

    import FSCalendar
    
    class YourCalendarVC: UIViewController {
        @IBOutlet weak var calendar: FSCalendar!
        @IBOutlet weak var prevMonthBtn: UIButton!
        @IBOutlet weak var nextMonthBtn: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // 绑定按钮点击事件
            prevMonthBtn.addTarget(self, action: #selector(onPrevMonthTapped), for: .touchUpInside)
            nextMonthBtn.addTarget(self, action: #selector(onNextMonthTapped), for: .touchUpInside)
        }
    
        // 上一页按钮点击事件
        @objc private func onPrevMonthTapped() {
            guard let currentPage = calendar.currentPage else { return }
            // 计算上一个月的日期
            let prevMonthDate = Calendar.current.date(byAdding: .month, value: -1, to: currentPage)!
            // 切换日历页面,animated设为true会有过渡动画
            calendar.setCurrentPage(prevMonthDate, animated: true)
        }
    
        // 下一页按钮点击事件
        @objc private func onNextMonthTapped() {
            guard let currentPage = calendar.currentPage else { return }
            // 计算下一个月的日期
            let nextMonthDate = Calendar.current.date(byAdding: .month, value: 1, to: currentPage)!
            calendar.setCurrentPage(nextMonthDate, animated: true)
        }
    }
    

    如果是Objective-C,逻辑完全一致,调用setCurrentPage:animated:方法即可:

    #import <FSCalendar/FSCalendar.h>
    
    @interface YourCalendarVC ()
    @property (weak, nonatomic) IBOutlet FSCalendar *calendar;
    @property (weak, nonatomic) IBOutlet UIButton *prevMonthBtn;
    @property (weak, nonatomic) IBOutlet UIButton *nextMonthBtn;
    @end
    
    @implementation YourCalendarVC
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.prevMonthBtn addTarget:self action:@selector(onPrevMonthTapped) forControlEvents:UIControlEventTouchUpInside];
        [self.nextMonthBtn addTarget:self action:@selector(onNextMonthTapped) forControlEvents:UIControlEventTouchUpInside];
    }
    
    - (void)onPrevMonthTapped {
        NSDate *currentPage = self.calendar.currentPage;
        NSDate *prevMonthDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMonth value:-1 toDate:currentPage options:0];
        [self.calendar setCurrentPage:prevMonthDate animated:YES];
    }
    
    - (void)onNextMonthTapped {
        NSDate *currentPage = self.calendar.currentPage;
        NSDate *nextMonthDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMonth value:1 toDate:currentPage options:0];
        [self.calendar setCurrentPage:nextMonthDate animated:YES];
    }
    
    @end
    

进阶优化:添加按钮状态控制

如果你的日历有允许切换的日期范围(比如只能看近一年的日期),可以通过FSCalendar的代理方法来动态控制按钮的启用/禁用状态:

  1. 设置FSCalendar的代理:

    override func viewDidLoad() {
        super.viewDidLoad()
        calendar.delegate = self
        // 可以先设置日历的允许范围
        let oneYearAgo = Calendar.current.date(byAdding: .year, value: -1, to: Date())!
        let oneYearLater = Calendar.current.date(byAdding: .year, value: 1, to: Date())!
        calendar.minimumDate = oneYearAgo
        calendar.maximumDate = oneYearLater
    }
    
  2. 实现代理方法更新按钮状态:

    extension YourCalendarVC: FSCalendarDelegate {
        func calendarCurrentPageDidChange(_ calendar: FSCalendar) {
            // 当日历页面切换时,更新按钮状态
            prevMonthBtn.isEnabled = calendar.currentPage > calendar.minimumDate!
            nextMonthBtn.isEnabled = calendar.currentPage < calendar.maximumDate!
        }
    }
    

这样当用户切换到最早允许的月份时,上一页按钮会自动禁用;切换到最晚月份时,下一页按钮禁用,提升用户体验。


内容的提问来源于stack exchange,提问作者priyanshu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:17