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

Posted

技术标签:

【中文标题】日历将事件位置存储到数组对象【英文标题】:Calendar Store event location to array object 【发布时间】:2012-06-17 17:59:17 【问题描述】:

这是我在这里的第一篇文章。我对 Obj-C 只有一点经验。我在 Lion 上的 XCode 3 中非常不推荐使用的 AppleScript Studio 中进行开发,但创建了一些 Obj-C 库供我的软件使用。这些库旨在将值传入和传回 AppleScript。其中之一访问日历存储。如果我的术语是无可救药的,请原谅我。 :)

问题在于尝试将“事件位置”放入可变数组中的对象中,该数组可以返回给 AppleScript。除了位置之外,我可以通过这种方式成功获取事件的几乎所有属性。

这是(部分)代码,其中包含我在 cmets 中遇到的构建错误:

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] == [NSNull null]) 而不是 if ([event location] = nil ,但同样的错误。

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

【问题讨论】:

【参考方案1】:

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

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

但是,这只有在 [event location] 不等于 nil 时才有效,正如下面 Richard 所指出的。在 Objective-C 中,当您尝试运行 [nil IsEqualToString:@""] 之类的内容时不会引发错误,它只会返回 nil。 if/then 将因此不会被执行。他的替代方案更安全:

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

PS:有关 IsEqualTo 方法范围的信息,请参阅苹果网站或 XCode 上的文档。您可以将一个字符串与整个丢失的有趣的其他事物进行比较。

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

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

【讨论】:

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

以上是关于日历将事件位置存储到数组对象的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 以编程方式将我们应用程序的自定义 URI 添加到存储在日历中的事件中

将事件添加到从服务器FullCalendar返回的事件数组中

从数据库获取事件并放置日历视图(android)

日历重复/重复事件 - 最佳存储方法

将事件保存到用户的日历

用拖放反应大日历