子类化NSCalendar?

时间:2010-08-19 21:44:06

标签: iphone

我正在尝试创建NSCalendar的子类,但没有太多运气。我尝试了两种方法:

  1. 彻底的类别。我可以创建一个修改过的对象和我添加的测试方法(不是NSCalendar的一部分)工作正常,但是覆盖方法不起作用 - 例如如果我调用dateFromComponents:,显然会调用NSCalendar方法,而不是我在类别定义中所写的

  2. 常规子类。在这种情况下,我甚至无法创建实例:initWithCalendarIdentifier抛出_CFRequireConcreteImplementation异常。最初我只在子类中重写了几个方法,但后来我覆盖了所有(记录的)NSCalendar方法 - 结果是一样的。

  3. 甚至可以继承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,我的狡猾计划似乎有一个重大问题。

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

3 个答案:

答案 0 :(得分:1)

即使您设法将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]),您不希望这样。你传递了什么日历标识符?也许它抱怨它需要一个“具体实现”,它知道你传递的日历标识符。

答案 1 :(得分:0)

尝试使用NSTimer方法

+ (NSTimer *)scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

将重复设置为TRUE,时间间隔为2分钟。有一个你设置为1或10的计数器。每次调用选择器时,你会减少计数器,直到你完成工作并重置计数器时它达到0。

答案 2 :(得分:0)

从NSCalendar直接继承是棘手的,因为我认为它是一个类集群。我对这个概念有点模糊,所以我会给你一个Apple文档的链接,而不是让自己变得更加愚蠢。

http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW34