UITableView сбой во время выполнения - PullRequest
0 голосов
/ 04 июля 2011
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"myCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    

NSArray *allSections =[self.tableDataSource allKeys];
NSArray *aSection = [self.tableDataSource objectForKey:[allSections objectAtIndex:indexPath.section]];
NSMutableDictionary *item = [aSection objectAtIndex:indexPath.row] ;

if (cell == nil) {

    /* Trace 1 */
    NSLog(@"Init: Section: %i - Row: %i", indexPath.section, indexPath.row);
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleBlue;

    UISwitch *mySwitch = [[UISwitch alloc] init];  
    [mySwitch addTarget:self action:@selector(checkButtonTapped:) forControlEvents:UIControlEventValueChanged];
    [mySwitch setOn:NO animated:NO];
    cell.accessoryView = mySwitch;
    cell.accessoryView.tag = [[item objectForKey:@"ID"] integerValue];
    cell.textLabel.text = [item objectForKey:@"Name"];
    [item setObject:cell forKey:@"cell"];

} else {

    /* Trace 2 */
    NSLog(@"Done: Section: %i - Row: %i", indexPath.section, indexPath.row);
    cell = [item objectForKey:@"cell"];

}

return cell;} 

Привет всем,

Я борюсь с аксессуарами UITableView +, которые иногда "вылетают" во время выполнения.Основной код tableView: cellForRowAtIndexPath чуть выше и, насколько я понимаю, действительно основан на стандартном шаблоне для UITableView.

Мой dataSource небольшой, это всего лишь набор из 2 разделов, одна из 6 строка другой всего 2 строчки.Реализованы все методы, касающиеся количества строк в разделе и количества разделов.

Пользовательский интерфейс в IB имеет необходимые соединения, и фактически все работает нормально.UITableView в IB немного меньше основного вида (под таблицей есть 2 кнопки).Когда я запускаю приложение, я вижу в представлении первые 6 строк (первый раздел), но последние 2 строки (второй раздел) скрыты.Конечно, если я прокручиваю вниз, появятся последние 2 строки ...

Проблема заключается в том, что я уменьшаю размер выхода UITableView в IB.Если розетка отображает только 2 или 3 строки из первого раздела во время выполнения, то при падении прокрутки произойдет сбой приложения.Авария произойдет в первом ряду второго раздела.Только в предыдущей ситуации изменился размер розетки IB, в коде ничего не изменилось.

Сообщение об ошибке в консоли:

* Ошибка подтверждения в - [UITableView _createPreparedCellForGlobalRow: withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:5678 2011-07-04 02: 08: 46.713 Клиент iWiR [95362: 207] * Завершение работы приложения из-за невыполненного исключения «NSInternalInconsistencyException»,причина: 'UITableView dataSource должен вернуть ячейку из tableView: cellForRowAtIndexPath:'

Если вы посмотрите на код, вы увидите, что есть 2 трассировки NSLog.Нормальным поведением для кода является то, что «Trace 1» будет отображаться в консоли для первого отображения строки, а затем, если я прокручиваю вверх и вниз, это будет «trace 2».Это тот случай, когда IBoutlet UITableView является «достаточно большим», но, как я уже сказал, если я уменьшу размер розетки, консоль будет отображать «Trace 2» даже для первого отображения строки.

Я надеюсь, что эти (длинные) объяснения достаточно ясны, и большое спасибо за вашу помощь ...

Приветствия, Пьер

1 Ответ

1 голос
/ 04 июля 2011

Представьте табличное представление с 6 строками, из которых 2 строки являются видимыми. Когда вы прокрутите вниз, чтобы получить 4-ую строку в видимой области, cell, которую вы удалили из представления таблицы, не будет nil, поэтому будет выполнено предложение else.

cell = [item objectForKey:@"cell"];

На данный момент для ключа cell не установлен объект. Таким образом, objectForKey: вернет nil, а ячейка будет nil, которую вы вернете в конце метода. Это причина ошибки, которая говорит 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:', когда вы возвращаете nil здесь.

Вы не используете ячейки повторно через механизм, предоставленный UITableView. Ваш метод должен быть больше похож на

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *allSections =[self.tableDataSource allKeys];
    NSArray *aSection = [self.tableDataSource objectForKey:[allSections objectAtIndex:indexPath.section]];
    NSMutableDictionary *item = [aSection objectAtIndex:indexPath.row] ;
    UITableViewCell *cell = [item objectForKey:@"cell"];    

    if (cell == nil) {
        NSLog(@"Init: Section: %i - Row: %i", indexPath.section, indexPath.row);
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];

        [..]
    }

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