Uitableview 滑动以删除不工作的行

Uitableview 滑动以删除不工作的行,uitableview,parse-platform,delete-row,uiswipegesturerecognizer,Uitableview,Parse Platform,Delete Row,Uiswipegesturerecognizer,我正在PFQueryTableViewController(使用Parse.com)中实现works滑动删除。当我去执行取消行动的细胞给我这个错误和应用程序崩溃 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

我正在PFQueryTableViewController(使用Parse.com)中实现works滑动删除。当我去执行取消行动的细胞给我这个错误和应用程序崩溃

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]*终止应用程序二至未捕获 异常“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
您有以下代码:

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

    return 0;
}
这表示在更新后,当表预期为4时,通知表中包含0个单元格。如果在故事板中使用静态单元格,则不应实现numberOfRowsInSection函数

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

编辑:
或者,如果确实需要numberOfRowsInSection函数,则需要将数据源连接到tableview。这将允许您返回数据源的计数。然后,当您删除一行时,您将删除数据源中相应的对象,使计数比以前少1。

您好,谢谢您的回复。。。然后,我尝试使用self.objects.count更改PfqueryTableViewController中的NSArray对象,但仍无法理解为什么。。。P.S.单元格是动态的,我该怎么办?您是否尝试在删除代码的情况下运行它?它崩溃的原因是UITableView希望在删除1后节中有4行。我的回答中的代码指定删除1后,表的节中应该有0行。因此,发生异常是因为0!=4.或者
self.objects.count的结果不等于4。尝试删除numberOfRowsInSection函数。如果您不理解,我很抱歉,但我没有太多经验,但我正在学习:D无论如何,我解决了,我仍在处理动画。我已完全删除并修改了numberOfRowInSection UITableViewCellEditingStyleDelete,如下所示:[tableView重新加载RowSatindExpaths:[tableView InExpathsForVisibleRows]和RowAnimation:UITableViewRowAnimationFade];[tableView EndUpdate];PFObject*object=[self.objects objectAtIndex:indexath.row];[object DeleteInBackgroundithBlock:^(布尔成功,N错误*错误){[self-loadObjects];}];非常感谢Mike+1为您服务Hanks Rory,您可以在PFQueryTableViewController示例代码中找到解决此奇怪问题的正确方法。也许你应该把它贴出来作为一个答案,让别人看得更清楚?