2010-05-30 116 views
2

我有一个NSMutableArray中包含我的系统上的所有日历(如CalCalendar对象):删除对象从NSMutableArray的

NSMutableArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars];

我想从calendars删除任何CalCalendar对象,其标题不包含字符串@"work"

我已经试过这样:

for (CalCalendar *cal in calendars) { 
    // Look to see if this calendar's title contains "work". If not - remove it 
    if ([[cal title] rangeOfString:@"work"].location == NSNotFound) { 
     [calendars removeObject:cal]; 
    } 
} 

该控制台抱怨说:

*** Collection <NSCFArray: 0x11660ccb0> was mutated while being enumerated.

,事情变坏。很明显,你似乎无法按照这种方式做我想做的事,所以任何人都可以提出最好的解决方法吗?

感谢,

回答

7

虽然你不能删除数组中的项目,你正在使用快速列举,你有一些选择:

由于markhunte指出,-calendars不neccessarily返回可变数组 - 你不得不使用-mutableCopy得到一个可变数组,你可以过滤:

NSMutableArray *calendars = [[[[CalCalendarStore defaultCalendarStore] 
           calendars] mutableCopy] autorelease]; 

...或者如-filteredArrayUsingPredicate:为不可变过滤副本。

NSArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars]; 
calendars = [calendars filteredArrayUsingPredicate:myPredicate]; 
+0

我去了'-filterUsingPredicate:'方法。工作非常出色,只需要两行代码!非常感谢。 – Garry 2010-05-30 17:13:39

4

你不能改变一个数组/列表你枚举(在任何语言,我所知道的)。您将需要创建第二个列表,您将添加要删除的日历。然后遍历第二个列表,从第一个列表中删除对象。然后,您可以丢弃第二个列表,仅保留原始列表,只保留您希望保留的日历。

0

我注意到的NSMutableArray会给从[CalCalendarStore defaultCalendarStore]日历]预期的结果。

但从[[CalCalendarStore defaultCalendarStore]日历]]返回的数组实际上是一个NSArray,而不是一个NSMutableArray。 (也有关于预期结构的警告)

这对我来说都是新的,所以我在这里错过了什么? 或这是正确的方式去完成这项任务..

NSMutableArray *workCals= [[NSMutableArray alloc] initWithCapacity:2]; 
[workCals addObjectsFromArray: [[CalCalendarStore defaultCalendarStore] calendars]]; 


NSString *title = @"work"; 

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"title contains[c] %@",title ]; 
[workCals filterUsingPredicate:predicate]; 
NSLog(@"workCals %@",workCals); 
[workCals release]; 

干杯。

+0

你说的没错,'-calendars'不会返回可变数组 - 我更新了我的答案。在未来,请使用评论(你可以得到50名声望后)或提出新问题而不是发布答案。 SO不是一个论坛,它是一个质量保证网站。 – 2010-05-30 20:32:24

+0

谢谢, 但我提供了一个答案。 我的问题是更多,是我的答案是正确的,由于Objective-c对我来说是新的。我将尽力在将来的正确位置保留评论和答案。 – markhunte 2010-05-30 22:47:33

+0

啊,它看起来更像是一个问题:)如果你想要一个可变的副本,只需使用'-mutableCopy',正如我在我的答案中指出的那样。 – 2010-05-31 05:34:59

相关问题