Error PFQueryTableViewController

Estoy siguiendo un tutorial en línea para crear una aplicación para compartir fotos usando Parse como back-end. He revisado el tutorial dos veces, creando la aplicación desde cero ambas veces, y aún se produce el mismo error en el mismo lugar. He buscado alta y baja para una solución y todavía no hay suerte.

Estoy usando un PFQueryTableViewController, y mi contenido se está cargando en múltiples secciones en lugar de filas. Cada sección muestra los detalles de PFUser en el encabezado de la sección, y cada sección tiene solo una fila, que muestra la image cargada por ese usuario. Al final de cada página (tengo pagination habilitada, cargando 3 objects a la vez) hay un button "Cargar más" para cargar los 3 objects siguientes en la vista de la tabla cuando se hace clic. Sin embargo, cuando hago clic en este button, mi aplicación se bloquea y presenta este error:

Falla de aserción en – [UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2935.137/UITableView.m:1114 2014-07-28 01: 50: 37.368 SampleCamApp [25686: 60b] La aplicación de finalización debido a la exception no detectada 'NSInternalInconsistencyException', motivo: 'intenta eliminar la fila 3 de la sección 0 que solo contiene 1 filas antes de la actualización'

Aquí está mi código:

#import "HomeViewController.h" @interface HomeViewController () @end @implementation HomeViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // This table displays items in the Todo class self.parseClassName = @"Photo"; self.pullToRefreshEnabled = YES; self.paginationEnabled = YES; self.objectsPerPage = 3; } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self loadObjects]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - PFQueryTableViewDataSource and Delegates - (void)objectsDidLoad:(NSError *)error { [super objectsDidLoad:error]; } // return objects in a different indexpath order. in this case we return object based on the section, not row, the default is row - (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section < self.objects.count) { return [self.objects objectAtIndex:indexPath.section]; } else { return nil; } } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if(section == self.objects.count) { return nil; } static NSString *CellIdentifier = @"SectionHeaderCell"; UITableViewCell *sectionHeaderView = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; PFImageView *profileImageView = (PFImageView *)[sectionHeaderView viewWithTag:1]; UILabel *userNameLabel = (UILabel *)[sectionHeaderView viewWithTag:2]; UILabel *titleLabel = (UILabel *)[sectionHeaderView viewWithTag:3]; PFObject *photo = [self.objects objectAtIndex:section]; PFUser *user = [photo objectForKey:@"whoTook"]; PFFile *profilePicture = [user objectForKey:@"profilePicture"]; NSString *title = photo[@"title"]; userNameLabel.text = user.username; titleLabel.text = title; profileImageView.file = profilePicture; [profileImageView loadInBackground]; return sectionHeaderView; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { NSInteger sections = self.objects.count; if(self.paginationEnabled && sections >0) { sections++; } return sections; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object { if(indexPath.section == self.objects.count) { UITableViewCell *cell = [self tableView:tableView cellForNextPageAtIndexPath:indexPath]; return cell; } static NSString *CellIdentifier = @"PhotoCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; PFImageView *photo = (PFImageView *)[cell viewWithTag:1]; photo.file = object[@"image"]; [photo loadInBackground]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if(section == self.objects.count) { return 0.0f; } return 50.0f; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == self.objects.count) { return 50.0f; } return 320.0f; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"LoadMoreCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == self.objects.count && self.paginationEnabled) { [self loadNextPage]; } } - (PFQuery *)queryForTable { PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; [query includeKey:@"whoTook"]; [query orderByDescending:@"createdAt"]; return query; } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end 

Cuando ejecuto mi aplicación, todo el contenido se carga correctamente, incluidas las imágenes, el text, etc. Es solo cuando presiono el button que comienza el problema. Sin embargo, soy bastante acogedor con el desarrollo de iOS, pero soy bastante nuevo en Parse, y esta es la primera vez que uso un PFQueryTableViewController. Por favor, hágamelo saber si estoy implementando algo incorrectamente, de lo contrario solo tendré que trabajar alnetworkingedor de un UITableViewController regular para que esto ocurra.

Creo que estoy haciendo el mismo tutorial que tú.

Conseguí que esto funcionara eliminando Parse.framework de mi proyecto, luego descargando e importando Parse.framework de "Lecture 25"

Simplemente debe ser que el marco de análisis más nuevo haya cambiado de alguna manera

una solución consiste en modificar el file personalizado PFQueryTableViewController.h proporcionado en ParseUI.

Simplemente incluya lo siguiente en su HomeViewController.m para anular el método similar proporcionado por Parse (si no existe, agréguelo a PFQueryTableViewController.h en ParseUI.Framework> Headers Agregue esto a la h .: - (NSIndexPath *)_indexPathForPaginationCell;

Llama al siguiente código en tu file .m:

 - (NSIndexPath *)_indexPathForPaginationCell { 

return [NSIndexPath indexPathForRow: 0inSection: [self.objectscount]];

}

El crédito es para un caballero llamado Axel Wittmann.

Es probable que su error esté relacionado con:

 return 1; 

En su método numberOfRowsInSection .

Es probable que la function 'loadMorePages' esté tratando de eliminar la fila que tiene el button 'Cargar más páginas'. Esto usualmente estaría en la fila 3 para ti (las primeras tres filas 0-2 son datos). Debido a que ha cambiado la forma en que se muestran las filas y las secciones, esto no funciona.

Los documentos para loadMorePages especifican que: Carga la siguiente página de objects, agrega a la tabla y actualiza.

Conozco esta edad, pero noté que la respuesta dada anteriormente no parecía funcionar de la forma en que fue escrita.

Sin embargo, esto funcionó:

 - (NSIndexPath *)_indexPathForPaginationCell { return [NSIndexPath indexPathForRow:0 inSection:self.objects.count]; }