表视图控制器单元格复选标记

时间:2014-02-21 16:59:58

标签: ios objective-c

我是Objective-c编码的新手。我试图在表视图控制器上实现一个复选标记。当我点击一个单元格时,我想看复选标记,当我重新点击该单元格时,我会消失。

例如,我在下面找到了这段代码。但我不明白一件事。 “数据”和“checkData”是什么意思?我们必须在该代码之前设置它们吗?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // do usual stuff here including getting the cell

    // determine the data from the IndexPath.row

    if (data == self.checkedData)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell; }

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // determine the selected data from the IndexPath.row

    if (data != self.checkedData) {
       self.checkedData = data;
    }

    [tableView reloadData]; }

所以我正在搜索一些代码,但我找不到任何代码。

我会很乐意提供任何帮助。

感谢。

3 个答案:

答案 0 :(得分:0)

创建一个包含所选索引的属性:

@property (nonatomic, assign) NSInteger selectedIndex;

然后:

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

      if (self.selectedIndex == indexPath.row) {
            self.selectedIndex = -1;
      } else {
            self.selectedIndex = indexPath.row;
      }
      [tableView reloadData];
}

并出现勾选标记:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // do usual stuff here including getting the cell

    if (indexPath.row == self.selectedIndex) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell; 
}

答案 1 :(得分:0)

您发布的代码不适用于一般用途。 要支持多个单元格选择,您需要额外的数据结构(例如布尔数组或NSIndexSet)来跟踪所选索引。然后,只要您tableView:didSelectRowAtindexPath:更新数据结构并强制重新加载表格,即[self.tableView reloadData]以显示/隐藏选择复选标记

一些代码块

@implementation TableViewController {
    NSArray * _data;
    NSMutableIndexSet *_selectedIndexes;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    ...
    self.selectedIndexes = [[NSMutableIndexSet alloc] init];
    ...
    return self;
}

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

        if ([_selectedIndexes containsIndex:indexPath.row]) {
            [_selectedIndexes removeIndex:indexPath.row];
        } else {
             [_selectedIndexes addIndex:indexPath.row];
        }

        [tableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ....

    if ([_selectedIndexes containsIndex:indexPath.row])
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    ...
    return cell; 
}

请注意,NSMutableIdexSet必须具有相同的NSArray长度,表示您用于填充tableView单元格的数据结构。 或者,正如我所说,你可以使用一个BOOL数组。

答案 2 :(得分:0)

有几种方法可以支持表格单元格上的复选标记。此示例代码似乎假设您在表视图中只有一个已检查的单元格,并且点击不同的单元格会将复选标记移动到该另一个单元格。

基本上,checkedData将是您班级的属性(通常您会使用UITableViewController的子类,但只要您的班级同时符合UITableViewDataSource,就不需要这样做。 {1}}和UITableViewDelegate)。 data变量派生自所选行。

这是填补空白的一种方式:

YourClass.h

// ...
@property int checkedIndex;
// ...

YourClass.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // do usual stuff here including getting the cell

    // See if this row is the checked row
    int thisRowIndex = indexPath.row;

    if (thisRowIndex == self.checkedIndex)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // determine the selected data from the IndexPath.row

    int thisRowIndex = indexPath.row;
    if (thisRowIndex != self.checkedData) {
        self.checkedIndex = thisRowIndex;
    }

    [tableView reloadData];
}

当然,这并不能解决您的问题。由于您希望单元格切换,因此您需要记录哪些单元格处于打开状态以及哪些单元格处于关闭状态。如果您只切换一个或两个单元格,则可以在类上使用一个或两个BOOL属性来表示每个单元格的状态。如果要切换的单元格数量较多,则应将每个单元格的状态存储在NSMutableArray中,并获取/设置与每个索引匹配的值。

YourClass.h

// ...
{
    NSMutableArray *_checkedRows; // This is an instance variable, not a property.
}
// ...

YourClass.m

// ================================================================
// Don't forget to initialize _checkedRows in your [init] method!!! 
// ================================================================

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // do usual stuff here including getting the cell

    // See if this row is the checked row
    BOOL rowIsChecked = [[_checkedRows objectAtIndex:indexPath.row] boolValue];

    if (rowIsChecked)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // determine the selected data from the IndexPath.row

    // Set the state of the cell to the opposite of what it currently is.
    BOOL rowIsChecked = [[_checkedRows objectAtIndex:indexPath.row] boolValue];
    [_checkedRows replaceObjectAtIndex:indexPath.row 
                            withObject:[NSNumber numberWithBool:!rowIsChecked]];

    [tableView reloadData];
}