tableview с 3 разделами разбился при прокрутке вниз

Я создаю табличное представление с 3 разделами, и каждый раздел заполняется из многомерного NSMutableArray. Значения добавляются в изменяемый массив, но приложение вылетает каждый раз, когда я пытаюсь установить тексты для меток в каждом разделе. Вот код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"wsolna hon");
static NSString *cellIdentifier = @"HomeTableViewCell";
HomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

// Configure the cell...
int row= [indexPath row];


                if (indexPath.section == 0){
                     homeObject = [homeArray[0] objectAtIndex:indexPath.row];

                        NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[homeObject.News dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
                    cell.NewsDateLabel.text= homeObject.News_Date;
                    cell.NewsLabel.attributedText= attrStr;
                    NSLog(@"news: %@", homeObject.News);

                }


                if (indexPath.section == 1){

                    homeObject = [homeArray[1] objectAtIndex:indexPath.row];

                   NSLog(@"value of indexpath for library: %d",row);
                   cell.NewsLabel.text= homeObject.Library_text;
                   cell.TestimonialNameLabel.text= @"";
                NSLog(@"Library: %@", homeObject.Library_text);
            }

                if (indexPath.section == 2){
                    homeObject = [homeArray[2] objectAtIndex:indexPath.row];

                     NSLog(@"news: %@",homeObject.Testimonial_Description);
                     cell.NewsLabel.text= homeObject.Library_text;
                     cell.TestimonialNameLabel.text = homeObject.Testimonial_Name;
                    NSLog(@"Testimonial: %@", homeObject.Testimonial_Description);

            }



  return cell;
 }

//здесь происходит заполнение массива NSMutable - (void) getDataFromDb {

NSString * paths=[self getWritableDBPath];

const char *dbpath =  [paths UTF8String];
sqlite3_stmt    *statement;
static sqlite3 *database = nil;

if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{

    NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM homedata", nil];

    const char *query_stmt = [querySQL UTF8String];

    //  NSLog(@"Databasae opened = %@", userN);

    if (sqlite3_prepare_v2(database,
                           query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {

        while(sqlite3_step(statement) == SQLITE_ROW)
        {


            NSString *modID= [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
            NSString *nDate = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 4)];
            NSString *nText = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
            NSString *dText = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
            NSString *tText = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
            NSString *tName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)];

            if ([modID isEqualToString:@"77"]){
              //  NSLog(@"News found: %@", nText);
                [homeArray[0] addObject:[[Home alloc]initWithItemID: modID andNewsName:nText andNewsDate: (NSString *) nDate andLibraryText: dText andTestDescription: tText andTestimonialName: (NSString *) tName]];
            } else if ([modID isEqualToString:@"81"]){
                [homeArray[1] addObject:[[Home alloc]initWithItemID: modID andNewsName:nText andNewsDate: (NSString *) nDate andLibraryText: dText andTestDescription: tText andTestimonialName: (NSString *) tName]];
              //   NSLog(@"Library found: %@", dText);
            } else if ([modID isEqualToString:@"78"]){
                [homeArray[2] addObject:[[Home alloc]initWithItemID: modID andNewsName:nText andNewsDate: (NSString *) nDate andLibraryText: dText andTestDescription: tText andTestimonialName: (NSString *) tName]];
              //   NSLog(@"News found: %@", tText);
            }
        }
        sqlite3_finalize(statement);
    }
    //  NSLog( @"Save Error: %s", sqlite3_errmsg(database) );

    sqlite3_close(database);
}
 }

и в ViewDidLoad у меня есть:

homeArray = [[NSMutableArray alloc] initWithObjects:[[NSMutableArray alloc] init], [[NSMutableArray alloc] init], [[NSMutableArray alloc] init], nil];

а также:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0)
{
    NSLog(@"woslit 3al 1");
    NSString *querySQL = [NSString stringWithFormat: @"SELECT count(*) FROM homedata where module_ID= 77"];
    return [self countcells:querySQL];
}
if(section == 1)
{
      NSLog(@"woslit 3al 2");
    NSString *querySQL = [NSString stringWithFormat: @"SELECT count(*) FROM homedata where module_ID= 78"];
    return  [self countcells:querySQL];
}

if (section == 2)
{
     NSLog(@"woslit 3al 3");
  return[self countcells:@"SELECT count(*) FROM homedata where module_ID= 81"];
}
 else return 0;
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

//TEMP SECTION STRING HOLDER:
NSString *sectionHeader = nil;


//SET TITLE FOR EACH SECTION:
if(section == 0) {
    sectionHeader = @"News";
}

if(section == 1) {
    sectionHeader = @"TYM Library";
}

if(section == 2) {
    sectionHeader = @"Testimonial";
}

Я могу получить значения, когда использую NSLog. но когда я сползаю вниз, он падает. Может кто-нибудь проверить, где может быть проблема? Спасибо!


person ralph    schedule 30.07.2014    source источник
comment
какое у вас сообщение об ошибке для сбоя?   -  person Mohit    schedule 30.07.2014
comment
это ошибка: [Home objectAtIndex:]: нераспознанный селектор отправлен экземпляру 0x1092a9f10   -  person ralph    schedule 30.07.2014
comment
есть проблема в данных вашего массива. он не получает никаких данных по этому индексу.   -  person Mohit    schedule 30.07.2014
comment
Точка останова исключения поможет вам   -  person Rajesh    schedule 30.07.2014
comment
Я использую NSLog для отображения всех своих данных. Все отображается, и в точке останова нет ошибки. Однако, когда я сползаю вниз, он сразу же падает   -  person ralph    schedule 30.07.2014
comment
попробуйте поместить NSLog на эти два и проверьте вывод 1- NSLog(@data на одном:%@,[homeArray[1] objectAtIndex:indexPath.row]); то же самое для homeObject = [homeArray[2] objectAtIndex:indexPath.row];   -  person Mohit    schedule 30.07.2014
comment
На какой строке происходит сбой кода? Пожалуйста, используйте точки останова, чтобы найти оскорбительный оператор. Что такое Home?   -  person duci9y    schedule 30.07.2014
comment
я использовал точки останова сейчас... он падает в этой строке: HomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];   -  person ralph    schedule 30.07.2014
comment
когда я прокручиваю вниз, он вылетает на этой строке   -  person ralph    schedule 30.07.2014
comment
Это не та линия, на которой он падает. Я не думаю, что вы знаете, как использовать точки останова.   -  person duci9y    schedule 30.07.2014
comment
ааа, здесь происходит сбой: homeObject = [homeArray[0] objectAtIndex:indexPath.row];   -  person ralph    schedule 30.07.2014
comment
Мне кажется, что данные вашей модели не являются массивом массивов, но вместо этого по крайней мере один из элементов массива верхнего уровня является объектом Home. Я не могу подтвердить, не увидев код, заполняющий объект модели.   -  person Droppy    schedule 30.07.2014
comment
@Droppy я отредактировал свой код   -  person ralph    schedule 30.07.2014
comment
Этот код выглядит нормально (кстати, homeArray не должен быть изменяемым). Покажите методы источника данных, которые возвращают количество разделов и строк в объекте данных.   -  person Droppy    schedule 30.07.2014
comment
хорошо, я снова отредактировал код   -  person ralph    schedule 30.07.2014
comment
Проверьте свой код на наличие строки, в которой вы случайно установили homeArray[i] = someObjectOfClassHome, или строки, в которой вы пытаетесь получить доступ к индексу домашнего объекта: [someObjectOfClassHome objectAtIndex:i], т. е. someObjectOfClassHome[i]. Определенно лучше возвращать размер массива в методе numberOfRowsInSection, как это было предложено @Droppy, но я не верю, что это решит вашу проблему. Я также не верю, что ошибка находится в коде, который вы разместили, но скрыта где-то еще в вашем коде.   -  person Mischa    schedule 30.07.2014


Ответы (1)


Ваш метод делегата источника данных numberOfRowsInSection должен возвращать количество элементов в подмассивах homeArray, а не из базы данных. Это намного быстрее и позволяет избежать проблем, когда база данных и версия данных в памяти не синхронизируются:

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section
{
    return [homeArray[section] count];
}
person Droppy    schedule 30.07.2014
comment
@ralph Вы посмотрели комментарий Миши к вашему вопросу? - person Droppy; 30.07.2014
comment
Хотя это хорошее предложение, оно не является причиной проблемы. - person duci9y; 30.07.2014