Scroll中隐藏的tableViewCell中的复选标记

时间:2016-11-03 07:52:52

标签: ios objective-c uitableview

当我滚动表格时,勾选标记为隐藏。我知道因为重用Cell,但我不知道如何修复。请帮助我。这是我的代码:

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

    StudentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[StudentTableViewCell alloc] init];
    }

    if (_btnCancel.hidden == NO) {
        cell.accessoryType = UITableViewCellAccessoryNone;

    } else {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    return cell;
}

我在didSelectRowAtIndexPath:

中更改了检查并取消选中
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell* cellCheck = [tableView cellForRowAtIndexPath:indexPath];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

    if (_btnCancel.hidden == NO) {
        if (cellCheck.accessoryType == UITableViewCellAccessoryNone) {
            cellCheck.accessoryType = UITableViewCellAccessoryCheckmark;
            TeacherInfo *courseStudent = studentQuitArray[indexPath.row];
            [dict setObject:courseStudent.id_user forKey:@"student_id"];

            [studentDetail addObject:dict];

        } else {
            cellCheck.accessoryType = UITableViewCellAccessoryNone;
            [studentDetail removeObject: studentQuitArray[indexPath.row]];
        }

    }
}

4 个答案:

答案 0 :(得分:2)

滚动表视图时,将调用特定单元格的javax.validation.constraints.NotNull,您将Settings > Editor > Inspections > @NotNull/@Nullable problems > Configure annotations设置为无。请尝试如下。

cellForRowAtIndexPath

didSelectRowAtIndexPath方法:

accessoryType

希望这会有所帮助。

答案 1 :(得分:1)

如果您正在重复使用单元格,则需要保存每个单元格的状态。因为每次向上和向下滚动时,TableView都会返回屏幕外的上一个单元格。

您可以在数组中保存可选状态,并在cellForRowAtIndexpath中读取其索引以获取单元格的当前状态。

答案 2 :(得分:1)

您也可以通过在" TeacherInfo"中添加一个布尔属性(如is-selected)来完成此操作。 NSObject类,并根据表行选择设置true false。

答案 3 :(得分:0)

试试这个:

您需要添加TeacherInfo的实例对象而不是student id,因为您的containsObject数组会产生错误的结果。

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

        StudentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
        if (cell == nil) {
            cell = [[StudentTableViewCell alloc] init];
        }

        if (_btnCancel.hidden == NO) {
           TeacherInfo *courseStudent = studentQuitArray[indexPath.row];
           if ([studentDetail containsObject:courseStudent]) {
               cell.accessoryType = UITableViewCellAccessoryCheckmark;
           else {
               cell.accessoryType = UITableViewCellAccessoryNone;
           }
        } else {
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }

        return cell;
    }

didSelectRowAtIndexPath方法:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell* cellCheck = [tableView cellForRowAtIndexPath:indexPath];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

    if (_btnCancel.hidden == NO) {
        if (cellCheck.accessoryType == UITableViewCellAccessoryNone) {
            cellCheck.accessoryType = UITableViewCellAccessoryCheckmark;
            TeacherInfo *courseStudent = studentQuitArray[indexPath.row];
            [studentDetail addObject:courseStudent];

        } else {
            cellCheck.accessoryType = UITableViewCellAccessoryNone;
            [studentDetail removeObject: studentQuitArray[indexPath.row]];
        }

    }
}