2

我是iOS 日历库的作者,我正在考虑如何改进它,因为很明显人们不理解它。

现在,我有一个只包含一个方法的数据源协议,它返回要在给定日期显示的事件:

- (NSArray *)calendarView:(CKCalendarView *)calendarView eventsForDate:(NSDate *)date;

但是,我发现在图书馆可用的两年里,我得到的大部分反馈都是“我如何让活动出现在日历上?”

我一直认为它非常直观:

  1. 创建一些事件。该框架有一个“事件”对象可以使用。
  2. 在某些数据源(如字典或 Core Data)中按日期对事件进行排序。
  3. 在数据源中返回适当的事件对象。

我还能做些什么来让其他开发人员更清楚我打算如何工作?

4

3 回答 3

6
  1. 您的用户想要她可以复制和粘贴然后编辑以适应她的问题的代码。她不想阅读一个接口然后从头开始实现它。所以在你的文档中放一个玩具实现。CKCalendarViewDataSource 玩具实现需要开箱即用。您的用户应该能够将其粘贴到她的项目中、编译并在日历视图中查看事件。该玩具可以只使用硬编码的事件数组([NSDate now]根据需要调用以确保默认日历月显示事件)。

    我认为在 README 中提供一个工作示例实现将最能减轻您的支持问题。

  2. 您的用户不想实现回调。她不考虑等待回答问题。她的想法是告诉你的图书馆该做什么。

    events向视图添加一个属性,该属性是CKCalendarEvent. 让用户设置eventsdataSourcedataSource如果有超过几十个事件,请注意您建议使用的文档和标题注释。如果用户同时设置两者,则引发异常。

  3. 如果您一直被问到“我如何让事件出现在日历上?” 然后将该语言放入您的文档中。 在您的文档中冗余是可以的!文档是为人类服务的,人类需要冗余。

    你可以有很大的部分标题,上面写着“如何向日历添加事件”、“如何在日历上显示事件”和“如何让事件出现在日历上”,它们都可以这样说事情(最好带有示例代码)或只是链接到“显示事件”部分。

  4. 在靠近顶部的文档中说明CKCalendarView需要像UITableView. 要明确!你我都认识这种模式,但显然你的用户不认识。

  5. 提供更好的数据源接口。查找事件 byNSDate并不是很理想,因为 anNSDate指定的是一个瞬间,而不是一整天。您想要在给定日历日发生的事件,但您不关心事件发生的时间。您是否正在通过感兴趣的那一天的午夜?如果活动在上午 8 点举行怎么办?更糟糕的是,如果活动是第二天凌晨 12:01,而夏令时从感兴趣的那一天开始,该怎么办?并非所有的日子都是 86,400 秒长!不要让你的用户乱用NSCalendar; 为她而做。

    我更喜欢这样的消息:

    - (NSArray *)calendarView:(CKCalendarView *)calendarView
        eventsOnOrAfterDate:(NSDate *)startingDate
        beforeDate:(NSDate *)endingDate;
    

    通过感兴趣日期的午夜(或某些时区某些日子的凌晨 1 点startingDate) 。过了第二天的午夜endingDate。请注意,您应该允许用户指定日历的时区来计算这些NSDates(但默认为[NSTimeZone systemTimeZone])。

    如果您的用户按日历日而不是精确的时间戳来存储她的事件,最好也指定以下消息:

    - (NSArray *)calendarView:(CKCalendarView *)calendarView
        eventsForYear:(int)year month:(int)month day:(int)day;
    
于 2014-11-07T23:02:35.020 回答
0

也许改变你的构造逻辑是个好主意CKCalendarView

例子:

CKCalendarView *calendar = [[CKCalendarView alloc] initWithDataSource:self];

或者

CKCalendarView *calendar = [[CKCalendarView alloc] initWithEventLoader:self];
于 2014-11-07T13:59:04.140 回答
0

我会去一个CKCalendarEvent协议:

@protocol CKCalendarEvent <NSObject>

- (NSDate *)date;
- (NSString *)title;
- (NSDictionary *)info;
- (UIColor *)color;

@end

events因此用户可以使用属性直接在数组中提供事件:

calendar.events = @[ event1, event2, ... ];
于 2014-11-07T13:39:30.390 回答