我正在我的PFQueryTableViewController(使用Parse.com)中实现滑动到删除的工作。当我去执行取消单元格的操作时,给我这个错误,应用程序崩溃。
Unigo 10/08/2013 15:40:50.683 [29142:a0b]在线用户:之间 Unigo 10/08/2013 15:40:54.495 [29142:a0b] *断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-2903.2 / UITableView.m 1330 Unigo 10/08/2013 15:40:54.499 [29142:a0b] * 终止应用程序2到未被捕获 异常'NSInternalInconsistencyException',原因:'无效 更新:第0节中的行数无效。行数 更新后的现有部分中包含的内容(5)必须相等 更新前该部分中包含的行数(5 ),加上或减去从那里插入或删除的行数 section(0插入,1删除)和加或减行数 移入或移出该部分(0移入,0移出)。 “
你能帮我弄清楚我错在哪里吗?
@implementation FFEsami
@synthesize FFNewLabelEsameInAttesa,FFViewEsameInAttesaAvviso,clock,ShowPanel,ArrayMutable;
-(id)initWithCoder:(NSCoder *)FFaDecoder {
self = [super initWithCoder:FFaDecoder];
if (self) {
self.parseClassName = FF_ESAMI_CLASS;
self.pullToRefreshEnabled = YES;
}
return self;
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
[self SetGraphSectionView];
[self queryForTable];
self.tableView.allowsSelectionDuringEditing = YES;
self.tableView.allowsMultipleSelectionDuringEditing = YES;
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.navigationItem.leftBarButtonItem = self.editButtonItem;
[self.navigationItem.leftBarButtonItem setTintColor:[UIColor whiteColor]];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self loadObjects];
}
#pragma mark - Parse
- (void)objectsDidLoad:(NSError *)error {
[super objectsDidLoad:error];
// This method is called every time objects are loaded from Parse via the PFQuery
}
- (void)objectsWillLoad {
[super objectsWillLoad];
// This method is called before a PFQuery is fired to get more objects
}
- (PFQuery *)queryForTable {
PFQuery *FFQueryPerTableView = [PFQuery queryWithClassName:FF_ESAMI_CLASS ];
[FFQueryPerTableView whereKey: FF_ESAMI_USER equalTo: [PFUser currentUser]];
[FFQueryPerTableView orderByDescending:FF_ESAMI_DATA_STRING];
if ([self.objects count] == 0) {
}
return FFQueryPerTableView;
}
-(void)SetGraphSectionView {
FFViewEsameInAttesaAvviso =[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 50)] ;
FFNewLabelEsameInAttesa = [[UILabel alloc]initWithFrame:CGRectMake(60, -1, 200, 50)];
FFNewLabelEsameInAttesa.numberOfLines = 2;
FFNewLabelEsameInAttesa.textAlignment = NSTextAlignmentLeft;
FFNewLabelEsameInAttesa.textAlignment = NSTextAlignmentLeft;
FFNewLabelEsameInAttesa.lineBreakMode = NSLineBreakByTruncatingTail;
clock = [[UIImageView alloc] initWithFrame:CGRectMake(17, 11, 25, 25)];
// ShowPanel = [[UIImageView alloc] initWithFrame:CGRectMake(280, 27, 20, 20)];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 50.0;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if(section==0){
PFQuery *query = [PFQuery queryWithClassName:FF_ESAMI_CLASS];
[query whereKey:FF_ESAMI_USER equalTo:[PFUser currentUser]];
[query whereKey:FF_ESAMI_STATUS equalTo:[NSNumber numberWithBool:YES]];
[query orderByAscending:FF_ESAMI_DATA_STRING];
[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
if (!object) {
NSString *titolo = [NSString stringWithFormat:@"Nessun esame imminente"];
FFNewLabelEsameInAttesa.text = titolo;
FFNewLabelEsameInAttesa.font = [UIFont fontWithName:@"HelveticaNeue" size:13];
FFNewLabelEsameInAttesa.textColor = [UIColor grayColor];
FFNewLabelEsameInAttesa.numberOfLines = 2;
FFViewEsameInAttesaAvviso.backgroundColor = [UIColor clearColor];
clock.image= [UIImage imageNamed:@"FFIMG_InAttesa"];
} else {
NSString *titolo = [NSString stringWithFormat:@"%@", [object objectForKey:FF_ESAMI_TITOLO]];
FFNewLabelEsameInAttesa.text = titolo;
FFNewLabelEsameInAttesa.font = [UIFont fontWithName:@"HelveticaNeue" size:13];
FFNewLabelEsameInAttesa.textColor = [UIColor whiteColor];
FFViewEsameInAttesaAvviso.backgroundColor = [UIColor colorWithRed:(203/255.0) green:(162/255.0) blue:(86/255.0) alpha:(0.90)];
clock.image= [UIImage imageNamed:@"FFIMG_InAttesaBianco"]; }
}];
ShowPanel.image= [UIImage imageNamed:@"FFDownView"];
[FFViewEsameInAttesaAvviso addSubview:FFNewLabelEsameInAttesa];
[FFViewEsameInAttesaAvviso addSubview:clock];
[FFViewEsameInAttesaAvviso addSubview:ShowPanel];
}
return FFViewEsameInAttesaAvviso;
}
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 0;
}
- (FFCustomListaEsamiCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
FFCustomListaEsamiCell *cell = (FFCustomListaEsamiCell * )[self.tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
if (!cell) {
cell = [[FFCustomListaEsamiCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
NSString *text = [object objectForKey:FF_ESAMI_TITOLO];
cell.FFTitoloEsameLabel.numberOfLines = 2;
cell.FFTitoloEsameLabel.text = text;
NSDateFormatter *FFDataFormattata = [[NSDateFormatter alloc] init];
[FFDataFormattata setDateFormat:FF_DATE_FORMATTER];
cell.FFDataEsameLabel.text = [NSString stringWithFormat: @"%@",[FFDataFormattata stringFromDate:[object objectForKey:FF_ESAMI_DATA_STRING]]];
PFObject *rowObject = [self.objects objectAtIndex:indexPath.row];
if([[rowObject objectForKey:FF_ESAMI_STATUS] boolValue])
{
//DATO CONVALIDATO
cell.last.image = [UIImage imageNamed:@"FFIMG_InAttesa"];
/*UIImage *btn = [UIImage imageNamed:@"FF_ChechOk"];
[cell.FFInserisciConvalida setImage:btn forState:UIControlStateNormal];
[cell.FFInserisciConvalida addTarget:self
action:@selector(FFConvalidaDato)
forControlEvents:UIControlEventTouchUpInside];
[cell.FFAltreAzioni addTarget:self
action:@selector(ActionSheetForStateInAttesa)
forControlEvents:UIControlEventTouchUpInside];*/
} else {
//DATO NON CONVALIDATO
//UIImage *btn = [UIImage imageNamed:@"FFIMG_ClockTAG"];
/* [cell.FFInserisciConvalida setImage:btn forState:UIControlStateNormal];
[cell.FFInserisciConvalida addTarget:self
action:@selector(FFMettiInAttesa)
forControlEvents:UIControlEventTouchUpInside];
[cell.FFAltreAzioni addTarget:self
action:@selector(ActionSheetForStateConvalidato)
forControlEvents:UIControlEventTouchUpInside];*/
}
return cell;
}
/*
// Override if you need to change the ordering of objects in the table.
- (PFObject *)objectAtIndex:(NSIndexPath *)indexPath {
return [objects objectAtIndex:indexPath.row];
}
*/
/*
// Override to customize the look of the cell that allows the user to load the next page of objects.
// The default implementation is a UITableViewCellStyleDefault cell with simple labels.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"NextPage";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = @"Load more...";
return cell;
}
*/
#pragma mark - Table view data source
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
PFObject *object = [self.objects objectAtIndex:indexPath.row];
[object deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
[self loadObjects];
}];[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade];
// [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the item to be re-orderable.
return YES;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
}
@end
答案 0 :(得分:1)
您有以下代码:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 0;
}
当表格预期为4时,告诉表格在其中有0个单元格。如果在故事板中使用静态单元格,那么就不应该实现numberOfRowsInSection函数。
如果删除该代码,则应该没有问题。
编辑: 或者,如果您确实需要numberOfRowsInSection函数,则需要将数据源连接到tableview。这将允许您返回数据源的计数。然后,当您删除一行时,您将删除数据源中的相应对象,以使计数比以前少1。