代码之家  ›  专栏  ›  技术社区  ›  Stephen Darlington

在UITableViewCell内编辑UITextField失败

  •  24
  • Stephen Darlington  · 技术社区  · 17 年前

    在我的申请表中,我有一个 UITextField UITableViewCell . 如果我在文本字段内单击并添加一些文本,我会发现如果尝试移动插入点,它会在第一次工作,但在随后的尝试中失败。我完全无法移动所选内容;没有出现“放大镜”。

    更奇怪的是,在我重新启动应用程序之前,这个“设置”似乎是永久的。它影响到所有人 UITextFields 在那个屏幕上,而不仅仅是我最初试图编辑的那个。

    如果您想亲自查看,请尝试iPhone SDK附带的“UICatalog”示例。单击“文本字段”,然后单击“编辑”并播放文本框。

    Apple's support board MacRumors formum (两者都引用了一个解决方案,该解决方案显然适用于iPhone 2.0,但不适用于当代版本——我确实尝试过)。

    我的感觉是,这是操作系统中的一个bug,但我想我会把它扔给这么多人,征求他们的第二个意见,看看是否有任何解决办法。有什么想法吗?

    6 回复  |  直到 17 年前
        1
  •  13
  •   pkamb santoshIOS    10 年前

    我花了很多时间在这个问题上,但我最终认为我已经解决了。

    诀窍在于表格需要是可编辑的(即其 editing YES

        2
  •  2
  •   Brian Criscuolo    17 年前

    多亏了这篇文章,我才能够成功地让它在我的应用程序中正常工作。

    然而,需要补充的是:

    - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return NO;
    }
    

    然后,在UITableViewCell的实现中,将UITableView设置为仅在实际编辑时才可编辑:

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
    {
        ((UITableView *)[self superview]).editing = YES;
    ...
    }
    

    - (void)textFieldDidEndEditing:(UITextField *)textField
    {
    ...
        ((UITableView *)[self superview]).editing = YES;
    }
    

    这将确保在不编辑单元格时,表格不会处于编辑模式,从而保持工作平稳。

    谢谢

    马克/太空公司。

        3
  •  2
  •   TimM    17 年前

    Brian M.Criscuolo的答案是最接近的,但它仍然不完全正确-在我使用SDK2.2.1时,我发现我必须执行以下操作:

    向UITableViewDelegate(通常是UITableViewController)添加以下两项:

    - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return NO;
    }
    

    以及:

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
    {
        return UITableViewCellEditingStyleNone;
    }
    

    以及:

    - (void)viewDidLoad {
    [super viewDidLoad];
    
        // do any other customisation here
    self.uiTableView.editing = true;
    }
    

    正如Brian所指出的,您不需要对textfield委托执行任何操作(除非您有多行,并且您希望响应didSelectRowAtIndexPath:事件—您在编辑模式下似乎没有收到该事件—然后您还需要按照他的建议执行)。

        4
  •  0
  •   benzado    17 年前

    这听起来确实像是一个操作系统错误。我将尝试通过对2.0、2.1和2.2 SDK运行UICatalog示例来复制它,以查看是否有任何更改。(如果为2.2构建,则会出现与表格单元格文本对齐相关的错误,但如果为2.1构建,则不会出现此错误,无论设备上的操作系统版本是什么。)

    https://bugreport.apple.com/

        5
  •  0
  •   lostInTransit    17 年前

        6
  •  0
  •   Daniel    13 年前

    - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return NO;
    }
    
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return NO;
    }
    

    您不需要在文本字段delegate中执行任何操作

        7
  •  0
  •   Saeed Ir    7 年前

    iOS 12 或者稍后,您可以在序列图像板中选择“表视图”单元,然后启用 在属性检查器中。