我试图做一个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/