Calendar将事件位置存储到数组对象

时间:2012-06-17 17:59:17

标签: objective-c macos cocoa calendar-store

这是我在这里的第一篇文章。我对Obj-C只有一点经验。我在Lion上的XCode 3中已经弃用的AppleScript Studio中开发,但是已经创建了一些用于我的软件的Obj-C库。这些库旨在将值传递给AppleScript并返回AppleScript。其中一个访问日历存储。如果我的术语无可救药地离开,请原谅我。 :)

问题在于尝试将“事件位置”放入可变数组中的对象中,该数组可以返回到AppleScript。除了位置之外,我可以成功地以这种方式获得事件的大部分属性。

这是(部分)代码,我在评论中遇到了构建错误:

NSEnumerator *eventEnumerator = [[calStore eventsWithPredicate:predicate] objectEnumerator];
   id event;
   while (event = [eventEnumerator nextObject]) {
NSMutableArray *eachEvent = [NSMutableArray arrayWithCapacity:10];


// the following, and most other properites not included here, works fine:

if ([event notes] == nil) {
[eachEvent addObject:[NSString stringWithFormat:@""]];
}
else
{
[eachEvent addObject:[event notes]]; //#06
}



@try {
if ([event location] == nil {
// error:
// invalid operands to binary == (have 'CGFloat' and 'struct NSNull *')

// incompatible type for argument 1 of 'addObject:'


[eachEvent addObject:[NSString stringWithFormat:@""]];
}
else
{
[eachEvent addObject:[event location]]; //#10
// error: incompatible type for argument 1 of 'addObject:'
}
}
@catch(NSException *exception) {
[eachEvent addObject:[NSString stringWithFormat:@"-10-"]];  // #10 dummy for location 
}

// now add all properties of this event (eachEvent) to all events information (eventInformation)
[eventInformation addObject:eachEvent];
   }
   return eventInformation;
}

我尝试使用if ([event location] = nil {而不是if ([event location] == [NSNull null])使用相同的错误。

任何人都可以对此有所了解,希望用正确的代码吗?

1 个答案:

答案 0 :(得分:0)

您应该尽量避免针对NSStringNULL或其他任何内容测试nil。这主要是你在C或C ++中使用的东西。在目标C中,您可以这样做:

...
if ( [ [event location] IsEqualToString:@""] ) {
...

但是,这只有在[事件位置]不等于nil 时才会起作用,如下面的Richard所指出的那样。在objective-C中,当您尝试运行类似[nil IsEqualToString:@""]的内容时,不会引发任何错误,它只返回 nil 。因此,不会执行if / then。他的选择更安全:

...
if ( [ [event location] length ] == 0 ) {
...

PS:有关IsEqualTo方法的信息,请参阅Apple网站或XCode上的文档。你可以将一个字符串与一些有趣的其他东西相比较。

PPS:另一件事可能是你在没有初始化location属性的事件上使用[eachEvent location]。实际上,理查德的修正就派上用场了。

如果它仍然不起作用,请告诉我!