重新加载表视图的数据不起作用

时间:2012-12-19 12:20:53

标签: objective-c ios uitableview

我用复选框制作一个tableview。我确实用UIButtons实现了复选框,我可以毫无问题地检查和取消选中它们。当我尝试进行“选择/取消选择全部”按钮时出现了问题,这就是结果代码:

-(IBAction)select:(id)sender{
    if (all==YES) {
        all=NO;
    }
    else {
        all=YES;
    }
    [tblPeticiones reloadData];
}

问题是该表不会重新加载数据。 任何的想法? 谢谢和问候。

编辑: 我像这样加载de数据

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  //Datos
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd-MM-yyyy"];

    NSString *fInicio = [dateFormatter stringFromDate:[(MAP_Gastos_CiberTRIPS *)[m objectAtIndex:indexPath.row] DEP_DATE]];
    NSString *loc = [(MAP_Gastos_CiberTRIPS *)[m objectAtIndex:indexPath.row] LOCATION];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [formatter setCurrencyCode:@"EUR"];
    [formatter setLocale:[NSLocale currentLocale]];
    NSString *precio = [formatter stringFromNumber:aux];
//Vista
    NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];

    CustomTVC *cell = (CustomTVC *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil) {
        cell = [[[CustomTVC alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
        //CheckBox
        UIButton *checkButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        [checkButton setFrame:CGRectMake(10, 10, 23, 23)];
        if (todos==NO) {
            [checkButton setBackgroundImage:[[UIImage imageNamed:@"checkNO.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
             checkButton.tag = 0;
        }
        else {
            [checkButton setBackgroundImage:[[UIImage imageNamed:@"checkSI.png"] str    etchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal]; 
            checkButton.tag = 1;
        } 

        [checkButton addTarget:self action:@selector(checkAction:) forControlEvents:UIControlEventTouchUpInside];

        [cell addSubview:checkButton];
        [cell.contentView addSubview:checkButton]; 
  //fecha
        UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(40, 0, 70.0,tableView.rowHeight)] autorelease];
        [cell addColumn:0];
        label.tag = 1;
        label.font = [UIFont boldSystemFontOfSize:12.0];
        label.text = fInicio;
        label.textAlignment = UITextAlignmentLeft;
        label.textColor = [UIColor blackColor];
        //label.backgroundColor = [UIColor whiteColor];
        label.autoresizingMask = UIViewAutoresizingNone | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:label]; 


        if (indexPath.row % 2 == 0){ 
            label.backgroundColor = [UIColor colorWithRed:233.0/255.0 
                                               green:233.0/255.0 
                                                blue:233.0/255.0 
                                               alpha:1.0]; 
        } else { 
            label.backgroundColor = [UIColor clearColor]; 

        }


        //localización
        label =  [[[UILabel alloc] initWithFrame:CGRectMake(115, 0, 75.0,tableView.rowHeight)] autorelease];
        [cell addColumn:180];
        label.tag = 2;
        label.font = [UIFont boldSystemFontOfSize:12.0];
        label.text = loc;
        label.textAlignment = UITextAlignmentLeft;
        label.textColor = [UIColor blackColor];
        //label.backgroundColor = [UIColor whiteColor];
        label.autoresizingMask = UIViewAutoresizingNone | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:label];

        if (indexPath.row % 2 == 0){ 
            label.backgroundColor = [UIColor colorWithRed:233.0/255.0 
                                                green:233.0/255.0 
                                                 blue:233.0/255.0 
                                                alpha:1.0]; 
        } else { 
            label.backgroundColor = [UIColor clearColor];     
        }
    }
    return cell;
}

3 个答案:

答案 0 :(得分:0)

您应该存储在数组中检查哪些行。然后在加载/重新加载tableview时检查此数组(在cellForRowAtIndex中)以查看是否应该检查该行。

然后,如果要选择all或none,只需删除或添加它们到数组并重新加载tableview。

如果您需要帮助实现此功能,请与我们联系。

答案 1 :(得分:0)

我发现了这个问题。这是工作代码:

-(IBAction)select:(id)sender{

    if (all==YES) {
        all=NO;
        [btnSelAll setBackgroundImage:[[UIImage imageNamed:@"checkSI.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal]; 

    }else {

        all=YES;
        [btnSelAll setBackgroundImage:[[UIImage imageNamed:@"checkNO.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal]; 
    }
    NSMutableArray *arrIndex = [NSMutableArray new];
    for(int i=0;i<[m count];i++) {
        [arrIndex addObject:[NSIndexPath indexPathForRow:i inSection:0]];
    }
    [self.tblPeticiones beginUpdates];
    [tblPeticiones reloadRowsAtIndexPaths:arrIndex withRowAnimation:UITableViewRowAnimationNone];
    [self.tblPeticiones endUpdates]; 
    [tblPeticiones reloadData];
}

答案 2 :(得分:0)

有关您的代码的一些评论:

  • 似乎有一个名为all的全局变量,当按下按钮时,您可以切换其值。但是在cellForRowAtIndexPath中,您检查另一个名为todos的全局变量的值。这些变量之间是否存在某种联系?
  • 仅在创建新单元格时更改复选框背景图像。由于单元格是循环使用的,因此您需要将此代码移到if (cell == nil)之外,即之后,您要自定义循环单元格
  • 您应该只检查if (todos)if (!todos),不要与YES或NO等值进行比较。切换布尔值的最简单方法是todos = !todos:)