0

我在我的PFQueryTableViewController(使用Parse.com)实施工作Swipe to Delete。当我去执行取消单元格的行为给我这个错误和应用程序崩溃。刷卡删除行不工作

Unigo网站2013年10月15:40:50.683 [29142:A0B]用户在线: Unigo网站2013年10月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] *终止应用程序二未捕获 异常'NSInternalInconsistencyException' :'无效 更新:节0中的行数无效。在更新之前(5),现有节中包含的行 的行数必须等于 到更新前该节中包含的行数(5 ),加上或减去插入或删除的行数 部分(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 

回答

1

你有这样的代码:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return 0; 
} 

这说的是表有0细胞,它的更新后,当表期待4.如果您使用的是静态的细胞在故事板,然后你不应该实现numberOfRowsInSection函数。

如果您删除该代码,那么你应该没有问题。

编辑: 或者如果你想要numberOfRowsInSection函数,那么你需要将一个数据源连接到tableview。这将允许您返回数据源的计数。然后,当你删除一行时,你会删除数据源中的相应对象,这样计数就比以前少了1。

+0

您好,感谢您的答复......然后我试图与self.objects.count改变 NSArray的对象是PfqueryTableViewController 但继续crasharee不明白为什么... 附:细胞是动态的,我该怎么办? – kAiN

+0

您是否尝试通过删除该代码来运行它?它崩溃的原因是因为你的UITableView期望在删除1之后的段中有4行。我的答案中的代码是指定在删除1后,表中应该有0行。因此,发生异常是因为0!= 4。或者'self.objects.count'的结果不等于4.尝试删除numberOfRowsInSection函数。 –

+1

对不起,如果你不明白,但我没有太多的经验,但我正在学习:D无论如何,我解决了,我仍然与动画工作。我已经完全删除并修改了numberOfRowInSection UITableViewCellEditingStyleDelete,如下所示: [tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade]; [tableView endUpdates]; PFObject * object = [self.objects objectAtIndex:indexPath.row]; [object deleteInBackgroundWithBlock:^(BOOL succeeded,NSError * error){[self loadObjects];}]; 非常感谢Mike +1为你 – kAiN