我试图做一个NSCalendar的子类,但是没有很多运气。我尝试了两种方法:


彻底的类别。我可以创建一个修改后的对象,并且添加的测试方法(不是NSCalendar的一部分)可以很好地工作,但是覆盖的方法不起作用-例如如果我调用dateFromComponents :,显然会调用NSCalendar方法,而不是我在类别定义中写的方法
常规子类。在这种情况下,我什至无法创建实例:initWithCalendarIdentifier引发_CFRequireConcreteImplementation异常。最初,我在子类中仅覆盖了几个方法,但是随后我覆盖了所有(已记录)NSCalendar方法-结果是相同的。


甚至可以继承NSCalendar吗?

我要这样做的原因是要以非标准的重复间隔重复进行本地通知。默认功能允许本地通知重复每个[日历单位],但是我需要不定期的间隔-例如我可以通过创建15分钟间隔的4个“每小时”通知来模拟“每15分钟”通知,但是我需要它们以T + 20,T + 22,T + 24,T + 44,T + 46, T + 66分钟,依此类推(T是开始时间)-通知之间的间隔是20分钟,然后是2分钟,然后是20分钟,依此类推。

我希望,因为UILocalNotification希望NSCalendar(在repeatCalendar属性中)计算何时触发下一个通知,所以我可以通过重写dateFromComponents来实现我想要的结果,即仅返回[NSDate dateWithIntervalSinceNow],间隔在20和2之间交替分钟-但我的狡猾计划似乎有一个主要问题,因为无法继承NSCalendar。

编辑:当应用程序在后台运行时,需要整件事。在前台,我使用计时器,就像没有人特别建议的那样。

最佳答案

即使您设法继承了NSCalendar,我也怀疑它会起作用。我强烈怀疑本地通知是由SpringBoard安排的,我不认为它每次需要查看下一个启动日期时都不会启动/恢复您的应用程序。

第一步是找出UILocalNotification对日历执行的操作。最简单的方法是编写一个NSObject子类,该子类转发未定义的方法调用并打印日志消息(respondsToSelector:,methodSignatureForSelector:,forwardInvocation :)。通常,您需要类似if ([super respondsToSelector:selector]) { return [super ...]; } else { return [target ...]; }的东西。

然后,最简单的技巧是编写一个类,该类实现用于您目的的NSCalendar必要方法。

您也可以考虑调用[super init]-[NSCalendar initWithCalendarIdentifier:]可能会返回不同的self(例如[self release]; return [[NSGregorianCalendar alloc] init]),而您不希望那样。您要传递什么日历标识符?也许是在抱怨它需要一个“具体的实现”,它知道您要传递的日历标识符。

关于iphone - 子类化NSCalendar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3526510/

10-10 15:24