过滤后数组中的日历超出范围

时间:2011-02-21 12:14:33

标签: objective-c nsmutablearray nspredicate

我正在制作一个小程序,将一些事件放在iPhone上的日历中。在设置中,我将让用户选择要使用的日历。为了呈现他可以使用的日历,我从EKEventStore中提取所有日历并对那些不允许修改的日历进行排序。这些是从其他网站订阅的。

在过滤器之后,似乎没问题,数组从5个减少到3个日历,数组中的所有对象都超出范围,并且tableview中的列表为空白。

我错过了什么?

编辑:当我开始使用过滤时,问题就出现了,这就是为什么我认为这就是问题所在,但现在看来当 - (NSArray *)availableCalendar返回数组时,对象超出了范围。我需要复制它还是什么?

图片在这里:http://d.pr/35HY

-(NSArray*)availableCalendars{
    NSArray *calendars;
    EKEventStore *eventDB = [[[EKEventStore alloc]init]autorelease];
    calendars = [[[NSArray alloc]initWithArray:[eventDB calendars]]autorelease];

    return calendars;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    allcalendars = [self availableCalendars];
    [allcalendars retain];

    localCalendars = [[NSMutableArray alloc]initWithArray:allcalendars];


    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"allowsContentModifications == YES"];
    [localCalendars filterUsingPredicate:predicate];

    calendarCountInt = localCalendars.count; //When I break the code here, the three objects are 'Out of Scope' and the count is three
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if (calendarCountInt > 0)
    {
        cell.textLabel.text = [[localCalendars objectAtIndex:indexPath.row] title] ;
    }
    else {
        cell.textLabel.text = @"No Calendars found";
    }


    return cell;
}

- (void)dealloc {
    [localCalendars release];
    [allcalendars release];
    [super dealloc]; 
}

1 个答案:

答案 0 :(得分:0)

你的代码很有趣。我猜你在return calendarCountInt;方法中正在进行tableView:numberOfRowsInSection:。如果你是,那么当没有允许修改的日历时,那将转到return 0;,从而产生一个空表。

我将如何做到这一点:

// this requires an @property(nonatomic, retain) NSArray *allCalendars
// with a corresponding NSArray *allCalendars ivar

// also, an @property(nonatomic, retain) NSArray *localCalendars
// with a corresponding NSArray *localCalendars ivar

// get all calendars and cache them in an ivar (if necessary)
- (NSArray *)allCalendars {
    if (allCalendars == nil) {
        EKEventStore *eventDB = [[[EKEventStore alloc] init] autorelease];
        [self setAllCalendars:[eventDB calendars]];
    }
    return allCalendars;
}

// get all modifiable calendars and cache them in an ivar (if necessary)
- (NSArray *)localCalendars {
    if (localCalendars == nil) {
        NSPredicate *filter = [NSPredicate predicateWithFormat:@"allowsContentModifications == YES"];
        [self setLocalCalendars:[[self allCalendars] filteredArrayUsingPredicate:filter]];
    }
    return localCalendars;
}

// there's only one section
- (NSUInteger)numberOfSectionsInTableView:(UITableView *)aTableView {
    return 1;
}

// show the number of modifiable calendars, or 1 (if there are no modifiable calendars)
- (NSUInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSUInteger)section {
    NSArray *local = [self localCalendars];
    return ([local count] > 0) ? [local count] : 1;
}

// set up the cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if ([[self localCalendars] count] > 0) {
        cell.textLabel.text = [[[self localCalendars] objectAtIndex:[indexPath row]] title];
    }  else {
        cell.textLabel.text = @"No calendars found";
    }
}

- (void)dealloc {
    [localCalendars release], localCalendars = nil;
    [allCalendars release], allCalendars = nil;
    [super dealloc]; 
}