管理UITableViewCell选择的状态

时间:2014-03-17 01:14:11

标签: ios objective-c uitableview

我有UITableViewController,带有静态表视图和2个部分。第一部分具有两个单元,具有布局表视图单元>内容视图>文字字段。

表格视图单元格的第二部分具有表视图单元格>的布局。内容视图>标签 - 使用beginUpdatesendUpdates并通过tableView:heightForRowAtIndexPath:报告单元格高度后,单元格会被展开。

现在,当我触摸其中一个第一部分时,单元格,键盘出现,光标放在文本字段中,但未选中单元格 - 这意味着如果我之前选择了第二部分中的一个单元格,它将保持选中状态(因此展开)。

text field as first responder but other cells selected

另外,如果我在第一部分中选择了一个单元格并给出第一个响应者的文本字段,那么我在第二部分中选择一个单元格,单元格会展开,但第一个单元格不会让第一个响应者退出并关闭键盘

我是否错误地布置了我的表视图,以便不自动管理单元格选择状态,如果没有:管理UITableViewCells的选定状态的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我不知道你是如何编写代码的。但是从上面的信息我创建了一个示例应用程序。代码如下所示,它可以正常工作。

我考虑了2节的表格。 第一部分有Cell上的文本字段。 第二部分在单元格上有UIlabel。 txtFieldCopy是在类的.h中声明的UITextField类型。

请检查我将标签分配给视图的方式,因为我们需要它来获取索引路径。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 2;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCellStyle style =UITableViewCellStyleSubtitle;
    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell  *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    int iTag=[indexPath row]+1;
    txtFieldCopy=nil;
    if(indexPath.section==1)
    {
        UILabel *lblFirst=nil;

        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:MyIdentifier];

                lblFirst = [[UILabel alloc] initWithFrame:CGRectMake(45, 0, 100,
                                                                     40)] ;

            lblFirst.tag=iTag;

            [cell.contentView addSubview:lblFirst];

            lblFirst=nil;
        }

        lblFirst = (UILabel *)[cell.contentView viewWithTag:iTag];

        cell.selectionStyle = UITableViewCellSelectionStyleBlue;

        lblFirst.text =@"Label 1";
    }
    else
    {
        UITextField *txtFirst=nil;

        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:MyIdentifier];

                txtFirst = [[UITextField alloc] initWithFrame:CGRectMake(40, 0, 50,
                                                                         40)] ;

            txtFirst.tag=iTag;
            txtFirst.delegate=(id)self;
            [cell.contentView addSubview:txtFirst];

            txtFirst=nil;
        }

        txtFirst = (UITextField *)[cell.contentView viewWithTag:iTag];

        cell.selectionStyle = UITableViewCellSelectionStyleBlue;

        txtFirst.text =@"text 1";
    }
    return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(txtFieldCopy)
    {
        [txtFieldCopy resignFirstResponder];
        txtFieldCopy=nil;
    }
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"%d",textField.tag);
    NSIndexPath *iRowId =[NSIndexPath indexPathForRow:(textField.tag-1) inSection:0];
    [tblSample selectRowAtIndexPath:iRowId animated:NO scrollPosition:UITableViewScrollPositionMiddle];
    txtFieldCopy=textField;
}

确保假设你正在重新加载表视图,然后调用cellForRowAtIndexPath中的txtFieldCopy=nil;并设置为null。所以你可以忽略这一行。但请在检查之前是否一次又一次地调用它。

让我知道它是否适合你。我相信它绝对适合你