在UITableViewCell内编辑UITextField失败

问题描述 投票:24回答:7

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

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

如果您想亲眼看到它,请尝试iPhone SDK附带的“UICatalog”示例。单击“文本字段”,然后“编辑”并使用文本框。

我已经做了很多挖掘,但谷歌很难做到!我发现的最好的参考资料是Apple's support boardMacRumors formum(两者都参考了一个显然曾经用于iPhone 2.0的解决方案,但不适用于当代版本 - 我确实尝试过)。

我的感觉是,这是操作系统中的一个错误,但我想我会把它扔到SO人群中以获得第二意见,看看是否有任何变通方法。有任何想法吗?

根据benzado的建议,我尝试使用2.0,2.1和2.2 SDK构建我的应用程序。我在所有版本中都有相同的行为。 (实际上,相关但不相同的东西在2.2中破裂但这可能是另一个问题!)

iphone cocoa-touch
7个回答
12
投票

我花了很多时间在这上面,但我终于认为我把它固定了。

诀窍是表格需要是可编辑的(即,它的editing属性需要设置为YES)。好消息是您现在可以移动插入点。有时放大镜没有出现或跟随,但你的手势似乎总是有效。

这还有资格作为错误吗?也许。至少应该更新Apple的SDK文档。我已经向Apple提出了一个错误报告来覆盖这个(rdar:// 6462725)。


2
投票

感谢这篇文章,我已经能够成功地在我的应用程序中正常工作。

但是要添加一些东西:

如果将表设置为可编辑,则可能会出现与预期不同的行为(缩进,编辑窗口小部件,没有披露指示符等)。这令我感到惊讶,但这里是如何最好地处理它:

在您的UITableView委托中,实现:

- (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;
}

当您不编辑单元格时,这将确保您的表格不处于编辑模式,从而保证工作顺利进行。

谢谢!

Brian M. Criscuolo Mark / Space Inc.


2
投票

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指出的那样对文本字段委托做任何事情(除非你有多行,你想要响应didSelectRowAtIndexPath:事件 - 你在编辑模式下似乎没有得到 - 然后你还需要按照他的建议去做)。

顺便说一句 - 这似乎在SDK3.0中修复(虽然我想改变)


0
投票

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

如果事实证明有所作为,https://bugreport.apple.com/


0
投票

我用我的应用程序尝试了这个,它似乎按预期工作。我每次都会放大镜。我正在使用2.1 SDK。


0
投票

实际上最好的方法似乎是在“viewDidLoad”中将表“editing”属性设置为true并将这些属性添加到表委托中

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

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

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


0
投票

在iOS 12或更高版本中,您可以在故事板中选择表格视图单元格,然后在属性检查器中启用“用户交互”。

© www.soinside.com 2019 - 2024. All rights reserved.