Календари в массиве вне области после фильтрации - PullRequest
0 голосов
/ 21 февраля 2011

Я делаю небольшую программу, которая поместит некоторые события в календарь на iPhone.В настройках я позволю пользователю выбрать, какой календарь использовать.Чтобы представить, какие календари он может использовать, я извлекаю все календари из EKEventStore и сортирую те, которые не допускают изменений.На них подписаны другие сайты.

После того, как фильтр, который вроде бы в порядке, массив сокращен с 5 до 3 календарей, все объекты в массиве находятся вне области видимости, а список в виде таблицыпусто.

Чего мне не хватает?

Редактировать: проблема возникла, когда я начал с фильтрацией, поэтому я подумал, что это была проблема, но теперь кажется, что объекты выходят изобласть действия, когда - (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 голосов
/ 21 февраля 2011

Ваш код ... интересен. Я предполагаю, что вы делаете 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]; 
}
...