2010-08-19 38 views
2

我试图做一个NSCalendar的子类,但没有多少运气。我试过两种方法:子类化NSCalendar?

  1. 彻底的类别。我可以创建一个修改后的对象,并添加一个测试方法(不是NSCalendar的一部分),但是重写方法不起作用 - 例如,如果我打电话给dateFromComponents:,NSCalendar方法显然被调用,而不是我在类别定义中写的

  2. 常规子类。在这种情况下,我甚至无法创建实例: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。

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

回答

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

+0

创建NSobject子类看起来不错,谢谢!它看起来正在被使用,因为当我实际上喂它NSObject派生代替NSCalendar时,出现了一个相当奇怪的模拟器崩溃:) 我曾经把它传递给一个普通的公历日历,没有什么奇特的(我不'无论如何不管用什么日历) – SVD 2010-08-20 21:04:12

0

尝试使用的NSTimer方法

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

设置重复为TRUE,并具有2分钟的时间间隔。请将计数器设置为1或10.每次调用选择器时,都会将计数器递减,直到您完成工作并重置计数器时为止。

+0

的NSTimer是很酷,但在后台不工作(我需要它的背景) - 对不起,我看起来像我是不是清楚这一点。 – SVD 2010-08-20 00:02:59

+0

当您的应用在后台挂起时,定时器不会运行,这是重复本地通知的整个时间点。 – 2010-08-20 00:17:59