在表视图中仅选择一个自定义单元格的文本字段

时间:2014-03-12 02:46:30

标签: ios objective-c uitableview keyboard

我在桌面视图上有自定义单元格。所有自定义单元格上都有一个文本字段。文本字段以禁用方式启动。我已经对它们进行了配置,以便在长按后,文本字段变为启用状态,用户可以编辑文本字段。

但是,我希望文本字段一次只能启用一个,这样用户就无法切换到其他单元格上的文本字段。所以我想只启用

这是我的代码

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

simpleTableIdentifier = @"SimpleTableCell";

cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

        [cell.textField setEnabled:NO];

        //put in long press
        UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
        [cell addGestureRecognizer:longPressGesture];
    }
}
}

然后我们有了这个:

- (void)longPress:(UILongPressGestureRecognizer *)gesture
{

if (gesture.state == UIGestureRecognizerStateBegan)
{
    // get affected cell
    cell = (SimpleTableCell *)[gesture view];

    // get indexPath of cell
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:0];

    // enabling text field
    [cell.textField setEnabled:YES];
    [cell.textField becomeFirstResponder];

}
}

如您所见,表视图上启用了所有文本字段。如何仅激活所选单元格的表格视图?

感谢。

4 个答案:

答案 0 :(得分:3)

你可以做的是首先隐藏cellForRowAtIndexPath中的所有文本字段然后当长按longPress:方法时取消隐藏该特定单元格的文本字段然后比较索引路径,如果它与长按一样然后取消隐藏

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

---------
if(indexPath.row == selectedIndexPathRow) {

   cell.textField.hidden = NO;   
    [cell.textField becomeFirstResponder];

}
else {

   cell.textField.hidden = YES;
---------
}

- (void)longPress:(UILongPressGestureRecognizer *)gesture
{

if (gesture.state == UIGestureRecognizerStateBegan)
{
    // get affected cell
    cell = (SimpleTableCell *)[gesture view];

    // get indexPath of cell
    selectedIndexPath = [self.tableView indexPathForCell:cell];
    selectedIndexPathRow = selectedIndexPath.row;

    [self.tableView reloadData];

}

}

答案 1 :(得分:0)

不要在长按处理程序方法中启用文本字段,只需使用该方法选择单元格,然后调用reloadData。在你的cellForRowAtIndexPath中,有一个if-else子句,如果索引路径等于所选行的索引路径,则启用文本字段,如果不是,则禁用它。

答案 2 :(得分:0)

按如下方式更新您的NSIndexPath内容:

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[gesture locationInView:cell]];

答案 3 :(得分:0)

所以我提出了一个简单的解决方案。我做了它,以便检查文本字段是否已经激活,如果不是,则启用其余的手势方法。如果启用了文本字段,则无法在任何其他单元格上触发该手势。很好地工作如下:

- (void)longPress:(UILongPressGestureRecognizer *)gesture
{
if (![cell.textField isEnabled]) {
// only when gesture was recognized, not when ended
if (gesture.state == UIGestureRecognizerStateBegan)
{
    // get affected cell
    cell = (SimpleTableCell *)[gesture view];

    // get indexPath of cell

    //NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[gesture locationInView:cell]];
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:0];


    [cell.textField setEnabled:YES];
    [cell.textField becomeFirstResponder];
}
}
}