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

Calendar Store event location to array object

提问人:Gajah Duduk 提问时间:6/18/2012 最后编辑:BenMorelGajah Duduk 更新时间:5/23/2014 访问量:344

问:

这是我在这里的第一篇文章。我对 Obj-C 只有一点经验。我在 Lion 上的 XCode 3 中非常不推荐使用的 AppleScript Studio 中进行开发,但创建了一些 Obj-C 库用于我的软件。这些库旨在将值传入和传回 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])

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

Objective-C macOS Cocoa 日历商店

评论


答:

0赞 Carelinkz 6/18/2012 #1

您应该尽量避免测试 against 或其他什么。这主要是你在 C 或 C++ 中使用的。在目标 C 中,您可以执行以下操作:NSStringNULLnil

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

但是,这只有在 [事件位置] 不等于 nil 时才有效,正如 Richard 在下面指出的那样。在 objective-C 中,当您尝试运行类似 的东西时,不会引发任何错误,它只是返回 nil。因此,if/then 将不会被执行。他的替代方案更安全:[nil IsEqualToString:@""]

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

PS:有关 IsEqualTo 系列方法的信息,请参阅 Apple 网站上的文档或您的 XCode。您可以将一根绳子与一整套有趣的其他事物进行比较。

PPS:另一件事可能是您正在对尚未初始化位置属性的事件使用。这确实是理查德的更正派上用场的情况。[eachEvent location]

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

评论

0赞 Richard J. Ross III 6/19/2012
当您可能应该检查时,这将不起作用,这适用于 nil 和空字符串。event.location == nil.[string length] == 0
0赞 Gajah Duduk 6/19/2012
感谢您的启发性提示。不幸的是,虽然空/零字符串问题无疑也是一个问题,但即使在任何比较或异常检查之外,我仍然收到指定的构建错误。也就是说,仅使用以下语句:“[eachEvent addObject:[event location]];”我收到“AddObj 参数 1 的不兼容类型”构建错误。所以。。。第一个问题似乎是正确初始化eachEvent对象。我在那里提供了我正在使用的整个代码,那么我在这方面做错了什么?谢谢。
0赞 Carelinkz 6/19/2012
...如果这些想法不是你需要的:知道操作数中的实际内容总是很方便的,所以试试......NSLog (@"operand1: %@",[event location]);
0赞 Gajah Duduk 6/19/2012
此外,使用上面 RadioPaque 给出的条件代码,错误现在在“if”行上是“无法转换为指针类型”。“不兼容的类型”错误仍保留在 addObject 语句上。
0赞 Carelinkz 6/19/2012
试试 NSLog 的东西。我认为编译器认为 [事件位置] 是 NSString 对象!