tableView: titleForHeaderInSection: вызывает сбой
По какой-то причине tableView: titleForHeaderInSection:
Метод вызывает сбой приложения, не давая никаких сведений о том, почему. Я знаю, что это тот метод, потому что, когда я его комментирую, таблица загружается, очевидно, без заголовков.
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *monthArray = [NSArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December", nil];
NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];
NSInteger year = [dateComponents year];
NSInteger month = [dateComponents month];
currentYear = [NSString stringWithFormat:@"%d", year];
nextYear = [NSString stringWithFormat:@"%d", year+1];
[dateComponents setMonth:month];
currentYearMonths = [[NSMutableArray alloc] init];
nextYearsMonths = [[NSMutableArray alloc] init];
for(uint i=month-1; i<=11; i++){
[currentYearMonths addObject:[monthArray objectAtIndex:i]];
}
for(uint i=0; i<month-1; i++){
[nextYearsMonths addObject:[monthArray objectAtIndex:i]];
}
[calendar release];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *sectionHeader = nil;
if(section == 0) {
sectionHeader = currentYear;
}
if(section == 1) {
sectionHeader = nextYear;
}
return sectionHeader;
}
3 ответа
Вам не хватает нескольких сохраняемых утверждений, смотрите ниже, где вы установили currentYear
а также nextYear
чтобы увидеть, что должно это исправить.
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *monthArray = [NSArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December", nil];
NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];
NSInteger year = [dateComponents year];
NSInteger month = [dateComponents month];
currentYear = [[NSString stringWithFormat:@"%d", year] retain];
nextYear = [[NSString stringWithFormat:@"%d", year+1] retain];
[dateComponents setMonth:month];
currentYearMonths = [[NSMutableArray alloc] init];
nextYearsMonths = [[NSMutableArray alloc] init];
for(uint i=month-1; i<=11; i++){
[currentYearMonths addObject:[monthArray objectAtIndex:i]];
}
for(uint i=0; i<month-1; i++){
[nextYearsMonths addObject:[monthArray objectAtIndex:i]];
}
[calendar release];
}
Я предполагаю, что currentYear
а также nextYear
освобождаются до вызова вашего метода делегата. Пытаться retain
в эти ивары.
Как говорили другие, объекты, на которые ссылаются переменные вашего экземпляра, не были должным образом сохранены.
Для ясности, "удобные" методы, которые вы использовали для получения ваших строк, выделяют новые строки. Они также помещают новые объекты в пул авто-релиза.
Например, используя "удобный" метод:
currentYear = [NSString stringWithFormat:@"%d", year];
такой же как:
currentYear = [[[NSString alloc] initWithFormat:@"%d", year] autorelease];
Поскольку вы хотите сохранить эти строковые объекты, вы можете просто использовать:
currentYear = [[NSString alloc] initWithFormat:@"%d", year];
но вы также можете сделать это:
currentYear = [[NSString stringWithFormat:@"%d", year] retain];
ОБНОВИТЬ
Также имейте в виду, что вы должны освобождать переменные экземпляра в реализации dealloc для класса.