十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FSCalendar 委托机制入门:FSCalendarDelegate 与 DataSource 完整方法清单(新手速查指南)

FSCalendar 委托机制入门:FSCalendarDelegate 与 DataSource 完整方法清单(新手速查指南) FSCalendar 委托机制入门FSCalendarDelegate 与 DataSource 完整方法清单新手速查指南【免费下载链接】FSCalendarA fully customizable iOS calendar library, compatible with Objective-C and Swift项目地址: https://gitcode.com/gh_mirrors/fs/FSCalendarFSCalendar 是一款高度可定制的 iOS 日历控件同时支持 Objective-C 与 Swift。要让它显示事件圆点、副标题并响应日期点击核心就是委托机制Delegate DataSource。本文带你快速看懂FSCalendarDelegate、FSCalendarDataSource与FSCalendarDelegateAppearance三个协议的分工并附全部29 个方法的完整清单、Swift/ObjC 双写法示例和新手避坑清单一篇就够你上手。一、先搞懂分工谁负责给数据谁负责收事件FSCalendar 采用 Apple 经典的 DataSource / Delegate 双角色设计协议定义见 FSCalendar.h协议角色一句话理解FSCalendarDataSource数据源日历来问你要数据某天的标题、副标题、图片、事件数、可选日期范围FSCalendarDelegate事件代理用户点了某天、日历要变高、切页了……这些通知发给你FSCalendarDelegateAppearance外观代理继承自 Delegate可按每一天定制颜色、圆角、偏移量 记忆技巧DataSource 是日历问你要Delegate 是日历主动告诉你。两个引用属性在 FSCalendar.h 中声明均为 weak所以 ViewController 持有日历即可无循环引用风险。二、三步接入委托ObjC / Swift 通用创建日历在loadView或viewDidLoad中实例化FSCalendar建立连接设置calendar.dataSource self和calendar.delegate self实现协议在你的 ViewController 上声明遵循三个协议按需实现方法全部为可选方法不实现则用默认外观。// Objective-C FSCalendar *calendar [[FSCalendar alloc] initWithFrame:CGRectMake(0, 64, 320, 300)]; calendar.dataSource self; calendar.delegate self;// Swift let calendar FSCalendar(frame: CGRect(x: 0, y: 64, width: 320, height: 300)) calendar.dataSource self calendar.delegate self如果你用 Interface Builder 拖拽配置只需把日历的dataSource、delegate出口连到 ViewController再实现协议即可步骤见 README.md 的 Setup 章节。三、FSCalendarDataSource 方法完整清单7 个协议源码FSCalendar.h。所有方法均为optional只写你需要的那几个。#方法ObjC 签名作用返回1calendar:titleForDate:替换某天显示的主文字NSString2calendar:subtitleForDate:在主文字下方显示副标题NSString3calendar:imageForDate:某天显示自定义图片UIImage4minimumDateForCalendar:日历允许的最小日期NSDate5maximumDateForCalendar:日历允许的最大日期NSDate6calendar:cellForDate:atMonthPosition:完全自定义某一天的 CellFSCalendarCell7calendar:numberOfEventsForDate:某天显示的事件圆点数量NSInteger实战示例ObjC 示例工程中按日期数组返回事件圆点数DelegateAppearanceViewController.m- (NSInteger)calendar:(FSCalendar *)calendar numberOfEventsForDate:(NSDate *)date { if ([_datesWithEvent containsObject:dateString]) return 1; if ([_datesWithMultipleEvents containsObject:dateString]) return 3; return 0; }Swift 中的等价写法见 DelegateAppearanceViewController.swiftfunc calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) - Int { return datesWithEvent.contains(dateString) ? 1 : 0 } 想让今天有标记直接设calendar.today NSDate()即可无需数据源方法。四、FSCalendarDelegate 方法完整清单7 个协议源码FSCalendar.h。主要处理用户交互与布局变化。#方法ObjC 签名触发时机1calendar:shouldSelectDate:atMonthPosition:点击某天前询问是否允许选中返回 NO 即禁点2calendar:didSelectDate:atMonthPosition:某天被选中后3calendar:shouldDeselectDate:atMonthPosition:点击已选日期前询问是否允许取消4calendar:didDeselectDate:atMonthPosition:某天取消选中后5calendar:boundingRectWillChange:animated:日历高度即将变化切换月/周模式时必处理6calendar:willDisplayCell:forDate:atMonthPosition:某个 Cell即将显示适合懒加载、动画7calendarCurrentPageDidChange:当前页翻页完成其中atMonthPosition:参数告诉你这个日期属于上个月、当前月还是下个月枚举FSCalendarMonthPosition见 FSCalendar.h跨月选日期时非常有用。最常用的组合禁用过去日期 点击回传业务日期- (BOOL)calendar:(FSCalendar *)calendar shouldSelectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)p { return ![date earlierDate:[NSDate date]].isEqual:date]; // 禁止选过去 } - (void)calendar:(FSCalendar *)calendar didSelectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)p { NSLog(选中%, date); // 在此跳转/提交 }五、FSCalendarDelegateAppearance 方法完整清单15 个协议源码FSCalendar.h。它继承自FSCalendarDelegate专门解决不同日期长得不一样的需求如节日标红、重要日期加粗。 颜色类10 个方法作用fillDefaultColorForDate:未选中状态的填充色fillSelectionColorForDate:选中状态的填充色titleDefaultColorForDate:未选中状态的主文字色titleSelectionColorForDate:选中状态的主文字色subtitleDefaultColorForDate:未选中状态的副标题色subtitleSelectionColorForDate:选中状态的副标题色eventDefaultColorsForDate:未选中状态的事件圆点颜色数组支持多色eventSelectionColorsForDate:选中状态的事件圆点颜色数组borderDefaultColorForDate:未选中状态的边框色borderSelectionColorForDate:选中状态的边框色 偏移与形状类5 个方法作用titleOffsetForDate:主文字偏移量CGPointsubtitleOffsetForDate:副标题偏移量imageOffsetForDate:图片偏移量eventOffsetForDate:事件圆点偏移量borderRadiusForDate:日期圆角返回 0 即方格风格⚠️ 使用原则全局统一样式请用calendar.appearance一次配置只有按天差异化才用本代理。返回nil表示沿用默认外观。完整的多色日期实战见 DelegateAppearanceViewController.m。六、新手避坑清单4 个高频问题⚠️ 不处理高度变化 → 日历被裁切切换月/周范围或显示 6 行占位日期时FSCalendar 不会自动改 frame必须实现boundingRectWillChange:同步 AutoLayout 约束或 frame。完整模板见 MOREUSAGE.md。⚠️ 忘记reloadData动态修改数据源如从网络加载事件后调用[calendar reloadData]才会刷新界面。 代理没生效检查两点是否真的设置了dataSource/delegate协议方法签名中的atMonthPosition:参数是否漏写。 多选模式设置calendar.allowsMultipleSelection YES后didSelectDate会连续触发业务层建议统一读取selectedDates只读数组见 FSCalendar.h而非逐个累加。七、小结一张表记住 29 个方法协议方法数何时实现FSCalendarDataSource7有事件圆点、副标题、图片、日期范围限制时FSCalendarDelegate7需要响应点击、禁用日期、处理布局变化时FSCalendarDelegateAppearance15需要按天差异化颜色/形状时协议定义都在 FSCalendar/FSCalendar.h配套用法文档见 MOREUSAGE.mdObjective-C 与 Swift 两套完整示例分别在 Example-Objc/ 和 Example-Swift/其中 DelegateAppearanceViewController.swift 展示了 Swift 下按天定制填充色的标准写法。照着清单逐个实现你就掌握了 FSCalendar 委托机制的全部能力。【免费下载链接】FSCalendarA fully customizable iOS calendar library, compatible with Objective-C and Swift项目地址: https://gitcode.com/gh_mirrors/fs/FSCalendar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表