想在TableView中一次只检查一个表格单元格

时间:2015-02-15 10:47:51

标签: objective-c checkbox tablecell

在下面的源代码中,我可以更改checkmark对象值,但在cellForRowAtIndexPath方法重新加载数据时,它会显示旧数据:

//TableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

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

        return [self.tableData count];

}

//CellforRowAtIndexpath showing old table data
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView     dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc]     initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Recipe *obj = nil;



        obj = self.tableData[indexPath.row];
        cell.textLabel.text = obj.name;

        NSLog(@"Reload Data %@", obj.checkmark);
        if ([obj.checkmark integerValue] == 1)
        {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;

        }
        else
        {
            cell.accessoryType = UITableViewCellAccessoryNone;
        }




    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    Recipe *recipe = nil;


        recipe = [self.tableData objectAtIndex:indexPath.row];
        if ([recipe.checkmark integerValue] == 1)
        {

            recipe.checkmark=@"0";
        }
        else
        {

            //recipe.checkmark=@"1";
            for (int i=0; i<[self.tableData count]; i++) {
                if (i==indexPath.row) {
                    recipe.checkmark=@"1";
                }
                else{
                    recipe.checkmark=@"0";
                }

                NSLog(@"PK ! %@", recipe.checkmark);
            }
        }
        //[self.tableData addObject:recipe.checkmark];
        [self.myTable reloadData];


    [self.myTable reloadData];

}

1 个答案:

答案 0 :(得分:0)

好消息通常是这个问题出现在行逻辑的单元格中,但看起来你有正确的部分。我相信问题出在您的单元格中,因为您没有正确更新tableData。请参阅下面的额外评论。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    Recipe *recipe = nil;

    recipe = [self.tableData objectAtIndex:indexPath.row];

    if ([recipe.checkmark integerValue] == 1)
    {
        recipe.checkmark=@"0";
    }
    else
    {

        //This only gets called if current checked cell is already checked
        for (int i=0; i<[self.tableData count]; i++) {
            if (i==indexPath.row) {
                recipe.checkmark=@"1";
            }
            else{
                //This is still the recipe for the cell currently selected
                recipe.checkmark=@"0";
            }

            NSLog(@"PK ! %@", recipe.checkmark);
        }
    }
    //[self.tableData addObject:recipe.checkmark];
    [self.myTable reloadData];


    [self.myTable reloadData];

}

这样的事情可以解决您的问题而不会改变太多的代码或结构。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    Recipe *recipe = [self.tableData objectAtIndex:indexPath.row];

    if ([recipe.checkmark integerValue] == 1)
    {
        recipe.checkmark=@"0";
    }
    else
    {
        recipe.checkmark=@"1";
    }

    //remove all old checkmarks
    for (int i=0; i<[self.tableData count]; i++)
    {
        //Only update recipes that are not in this row
        if (i!=indexPath.row)
        {
            recipe = [self.tableData objectAtIndex:i];
            recipe.checkmark=@"0";
        }
    }

    [self.myTable reloadData];

}

要考虑的另一件事是,而不是使用您要转换为类似BOOL的整数的字符串,只需将配方的属性选中标记更改为BOOL即可。我希望有所帮助,祝你好运。