2015-03-25 2 views
0

Я пытаюсь заполнить контроллер Tableview с объектами из 2-х разных массивов, но он выходит из строя и дает эту ошибку «завершающему приложение из-за неперехваченное исключение„NSRangeException“, причина:" - [__NSArrayM objectAtIndex:]: индекс 1 за пределами границ [0 .. 0] "***Заполнение таблицы с 2 массивами

как исправить это? Ниже мой код:

(void)viewDidAppear:(BOOL)animated{ 
//[super viewDidAppear:<#animated#>]; 

NSManagedObjectContext *bookmanagedObjectContext = [self managedObjectContext]; 
NSFetchRequest *bookfetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Book"]; 
NSPredicate *bookpredicate =[NSPredicate predicateWithFormat:@" bookref.toproject contains[cd]%@",self.projectdb]; 
[bookfetchRequest setPredicate:bookpredicate]; 
NSSortDescriptor *booksortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"authorSurname" ascending:YES]; 
NSArray *booksortDescriptors = [[NSArray alloc]initWithObjects:booksortDescriptor, nil]; 
[bookfetchRequest setSortDescriptors:booksortDescriptors]; 

self.BookrefArray = [[bookmanagedObjectContext executeFetchRequest:bookfetchRequest error:nil] mutableCopy]; 

NSManagedObjectContext *journalmanagedObjectContext = [self managedObjectContext]; 
NSFetchRequest *journalfetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Journal"]; 
NSPredicate *journalpredicate =[NSPredicate predicateWithFormat:@" journalref.toproj contains[cd]%@",self.projectdb]; 
[journalfetchRequest setPredicate:journalpredicate]; 
NSSortDescriptor *journalsortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"surname" ascending:YES]; 
NSArray *journalsortDescriptors = [[NSArray alloc]initWithObjects:journalsortDescriptor, nil]; 
[journalfetchRequest setSortDescriptors:journalsortDescriptors]; 

self.JournalrefArray = [[journalmanagedObjectContext executeFetchRequest:journalfetchRequest error:nil] mutableCopy]; 
[self.tableView reloadData];} 

(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
#warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
#warning Incomplete method implementation. 
// Return the number of rows in the section. 
return (self.BookrefArray.count + self.journalrefArray.count); 
} 



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cells"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    Journal *myjournal =[self.journalrefArray objectAtIndex:indexPath.row]; 
    [cell.detailTextLabel setText:[myjournal valueForKey:@"journalname"]]; 
    [cell.textLabel setText:[NSString stringWithFormat:@"%@, %@",[myjournal valueForKey:@"surname"],[myjournal valueForKey:@"firstname"]]]; 
    Book *mybook =[self.BookrefArray objectAtIndex:indexPath.row]; 
    // Configure the cell... 
    [cell.detailTextLabel setText:[mybook valueForKey:@"bookTitle"]]; 
    [cell.textLabel setText:[NSString stringWithFormat:@"%@, %@",[mybook valueForKey:@"authorSurname"],[mybook valueForKey:@"authorOthernames"]]]; 

    return cell; 
} 
+0

Вам нужно предоставить более подробную информацию о своих массивах - где они инициализированы? – Luke

+0

Я отредактировал код выше – yasmin

ответ

0

Вы имеете эту ошибку, потому что вы пытаетесь получить доступ элемента вашего массива, не существует.

Фактически вы говорите, что в вашей таблице есть элементы «table1.count + table2.count», и для каждой ячейки вы пытаетесь получить элемент в ваших двух таблицах с текущей строкой. Например, если таблица1 имеет 2 элемента, а таблица2 имеет 5 элементов , ваш стол будет иметь 7 строк, а «cellForRowAtIndexPath» будет называться 7 раз. Таким образом, для индекса 3 вы получите эту ошибку, потому что ваша таблица1 имеет только 2 элемента.

Чтобы решить эту проблему, вы должны получить книгу ИЛИ журнал в функции этой строки. Например, вы можете попробовать что-нибудь вроде этого:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cells"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    if (indexPath.row < self.BookrefArray.count) 
    { 
    Book *mybook =[self.BookrefArray objectAtIndex:indexPath.row]; 
    // Configure your cell with a book 
    } 
    else 
    { 
    Journal *myjournal =[self.journalrefArray objectAtIndex:indexPath.row - self.BookrefArray.count]; 
    // Configure your cell with a journal 
    } 

    return cell; 
} 

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

+0

благодаря тому, что код работает ... но как это сделать, чтобы разрешить удаление BookrefArray ... using (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editStyle forRowAtIndexPath: (NSIndexPath *) indexPath ??? – yasmin

+0

Используя тот же метод в функции commitEditingStyle, «if (indexPath.row

+0

это сработало .... спасибо !!! – yasmin

0

Ответ:

Вам необходимо дифференцировать книгу и журнал в -cellForRowAtIndexPath.

Объяснение:

Ваш звонок для TableView-х -cellForRowAtIndexPath будет зависеть от количества вы возвращающегося из -numberOfRowsInSection метода Tableview в.

Так, к примеру, у Вас есть объекты в BookrefArray и объектов в journalrefArray, -numberOfRowsInSection метод вашего Tableview вернется 5, что означает -cellForRowAtIndexPath будет называться по 5 раз.

Давайте пройдемся по этой линии:

Journal *myjournal =[self.journalrefArray objectAtIndex:indexPath.row]; 

Здесь, он будет получать indexPath.row = 5 за исключением одного случая, и ваш journalrefArray содержит только объекты. Итак, вы получаете ошибку "index .. beyond bounds".

Update:

Вы можете просто объединить оба массивов в один.

[documentsArray addObjectsFromArray:self.BookrefArray]; 
[documentsArray addObjectsFromArray:self.journalrefArray]; 

, а затем в -cellForRowAtIndexPath, вы можете сделать что-то вроде этого:

id document = [documentsArray objectAtIndex:indexPath.row]; 
if ([document isKindOfClass:Book]) 
{ 
    Book *mybook = (Book *)document; 
    // Do something with mybook. 
} 
else 
{ 
    Journal *myjournal = (Journal *)document; 
    // Do something with myjournal. 
} 
+0

вещь количество объектов зависит от входов ... и нет ограничений на количество входов ... и indexPath.row = 5 не работает ... – yasmin

Смежные вопросы