表视图与自定义单元格

时间:2011-09-01 12:32:31

标签: iphone objective-c ios ios4

我的App中有自定义单元格的tableview,每个单元格包含两个复选框按钮。

问题是,当触发(向上或向下)滚动事件时,它正在重新加载tableview。因此,复选框按钮变为初始状态。

请给我一个解决方案。

谢谢你

5 个答案:

答案 0 :(得分:1)

您必须自己维护一个列表,以确定应该检查哪些单元格。请记住,在tableView:cellForRowAtIndexPath:中,正确的实现将循环使用单元格,以便您永远不会实例化超过10-15个单元格。如果您没有正确处理它,这可能会导致一些时髦的结果。当我完成一个糟糕的实现时,我已经看到某些单元属性从一个单元格“延续”到下一个单元格。

无论如何,这是我推荐的(基于我认为你的要求):
1.创建一个类来支持每个UITableViewCell
2.在该类中创建一个属性,以确定应检查两个复选框中的哪一个(或两者都不)。
3.在ViewController / TableViewController中,维护一个NSMutableArray / NSArray,其中数组中的1个项目= UITableView中的1个单元格。
4.在tableView:cellForRowAtIndexPath:方法中,获取对数组中相应项的引用。
5.然后,检查该实例的属性并适当设置复选框值。

<小时/> 示例代码:

TableView.h

@interface TableView : UITableViewController 

@property (strong, nonatomic) NSMutableArray *itemArray;

@end

TableView.m

@implementation TableView

@synthesize itemArray;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Assume you get a valid, custom UITableViewCell at this point (named "cell")

    // Configure the cell...
    NSObject *classItem = [[self itemArray] objectAtIndex:[indexPath row]];
    [[cell checkBox1] setChecked:[classItem checkbox1Checked]];
    [[cell checkBox2] setChecked:[classItem checkbox2Checked]];

    return cell;
}

@end

答案 1 :(得分:0)

那么你不应该使用TableView作为数据源。

每次进入单元格时,都会要求UITableViewDataSource将UITableViewCell作为索引路径。

- (void) tableView:(UITableView *)tableView setImage:(UIImage *)image forCellAtIndexPath:(NSIndexPath *)indexPath 

在is方法中,您应该设置复选框状态,因为它反映在您的dataSource中。 当复选框被更改时,将其保存在具有所选状态的数据源中。

示例:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"CheckedTableViewCell";

    CheckedTableViewCell *cell = (CheckedTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell) {
        [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil];
        cell = (CheckedTableViewCell *)self.nibCell;
        self.nibCell = nil;
    }

    item *item = [self objectAtIndexPath:indexPath];

    cell.titleLabel.text = item.title;
    cell.switch.on = item.selected;

    return cell;
}

答案 2 :(得分:0)

单击它时,可以在NSUserDefaults中保存状态。只需添加@selector(changedOne: )的目标并添加void语句:

- (void)changedOne: (id)sender  {
    NSUserDefaults *df = [NSUserDefaults standardUserDefaults];
    NSString *row = [NSString initWithFormat:@"toggleOneRow%i",indexPath.row];
    if (sender.on) {
        [df setBool:YES forKey:row];
    }
    else {
        [df setBool:NO forKey:row];
    }
}

答案 3 :(得分:0)

您使用的是cellForRowAtIndexPath吗?如果是,那么而不是

 static NSString CellIdentifier=@"CellIdentifier"

使用

 NSString *CellIdentifier=[NSString stringWithFormat=@"CellIdentifier%d",indexPath.row];

您可以采取的其他方法是将标签分配给复选框按钮,并在appDelegate文件中设置一个字典,并为复选框标记设置值。最初可以设置为已选中或未选中。并在cellforrowatindexpath方法中设置值。根据appdelegate字典设置复选框的值。当用户选择或取消选择按钮时,更新appdelegate字典中的状态。

答案 4 :(得分:0)

您应该在数据源中设置按钮的状态,并在创建单元格时加载此状态。我写了small Xcode project来证明这一点。