UITableView аварийно завершает работу, когда прокручивается на не верхнюю сторону и произносит индекс 2 за пределами [0..1] - PullRequest
0 голосов
/ 21 ноября 2011

Теперь я сталкиваюсь со странной ситуацией, мне нужна ваша помощь и простите мой плохой английский.

Когда UITableView, заполненный NSArray, сверху, действительно перезагружает данные, когда я использую [UITableView reloadData]. Но таблица не перезагружает данные, если она не на верхней стороне. На самом деле приложение упало. Странно то, что indexPath.section не правильное значение, большее, чем реальное значение. Так консоль сказала: index 2 beyond bounds [0..1].

Кто-нибудь знает почему? Пожалуйста, дайте мне руку или советы.

Ниже приведены некоторые коды:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if (pageCount == 0) {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"IPOCalendarTableTitle" object:nil];
        return 0;
    } else {
        NSMutableArray *arrayMonths = [stockArray objectAtIndex:pageIndex];
        NSMutableArray *arrayDays = [arrayMonths objectAtIndex:0];
        IPOListing *listing = [arrayDays objectAtIndex:0];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyy/MM/dd";
        NSDate *date = [formatter dateFromString:listing.date];
        NSString *s = nil;

        NSArray *arrayMonthEN = [NSArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec", nil];
        AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        if ([delegate.currentLanguage isEqualToString:@"SC"]) {
            formatter.dateFormat = @"yyyy年M月";
            s = [formatter stringFromDate:date];
        } else if ([delegate.currentLanguage isEqualToString:@"TC"]) {
            formatter.dateFormat = @"yyyy年M月";
            s = [formatter stringFromDate:date];
        } else if ([delegate.currentLanguage isEqualToString:@"EN"]) {
            int year = [[listing.date substringWithRange:NSMakeRange(0, 4)] intValue];
            int month = [[listing.date substringWithRange:NSMakeRange(5, 2)] intValue];
            s = [NSString stringWithFormat:@"%@, %d", [arrayMonthEN objectAtIndex:month - 1], year];
        }

        [formatter release];

        NSArray *array = [NSArray arrayWithObjects:s, [NSNumber numberWithInt:pageCount], [NSNumber numberWithInt:pageIndex], nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"IPOCalendarTableTitle" object:array];
        NSLog(@"%d", [arrayMonths count]);
        return [arrayMonths count];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    NSMutableArray *arrayMonths = [stockArray objectAtIndex:pageIndex];
    NSMutableArray *arrayDays = [arrayMonths objectAtIndex:section];
    return [arrayDays count];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 36.0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"IPOCalendarCellIdentifier";
    IPOCalendarCell *cell = (IPOCalendarCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"IPOCalendarCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    cell.lineLabel.backgroundColor = [UIColor colorWithRed:240/255.0 green:240/255.0 blue:240/255.0 alpha:1.0];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    NSLog(@"%d, %d", indexPath.section, indexPath.row);

    NSMutableArray *arrayMonths = [self.stockArray objectAtIndex:pageIndex];
    NSMutableArray *arrayDays = [arrayMonths objectAtIndex:indexPath.section];
    IPOListing *listing = [arrayDays objectAtIndex:indexPath.row];

    // configuration the cell...

    return cell;
}

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Если indexPath.section не является правильным значением, я уверен, что оно как-то связано со значением, которое вы возвращаете - (NSInteger) numberOfRowsInSection: (UITableView *) tableView

Сначала проверьте это, потому что если размер вашего массива равен двум, то есть значение, возвращаемое функцией numberOfRowsInSection :, indexPath.section не может быть равно или больше этого значения.

0 голосов
/ 22 ноября 2011

Fixed.Проблема не в этом, а в двух бандитских таблицах.Когда я использую [UITableView setContentOffset] для таблицы A, B тоже обновится.В этом случае таблица A будет дважды перезагружать данные, а когда contentOffset таблицы равен нулю, она будет перезагружать данные только один раз.Когда таблица reloadData дважды за короткое время вылетает.Спасибо всем вам, и мне очень жаль моей ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...