2010-05-30 159 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

相關問題