在UITableViewCell中编辑UITextField失败

26
在我的应用程序中,我在UITableViewCell中放置了一个UITextField。如果我点击文本框并添加一些文本,我发现如果尝试移动插入点,第一次会成功,但后续尝试将失败。我完全无法移动选择;没有“放大镜”出现。
更加奇怪的是,这个“设置”似乎是永久性的,直到我重新启动应用程序。它影响该屏幕上的所有UITextFields,而不仅仅是我最初尝试编辑的那个。
如果您想自己看到它,请尝试使用iPhone SDK附带的“UICatalog”示例。单击“文本字段”,然后单击“编辑”,并玩弄文本框。
我已经做了很多挖掘,但很难在Google上搜索!我找到的最好的参考资料是Apple's support boardMacRumors formum(两者都提到了一种解决方案,显然适用于iPhone 2.0,但在当代版本中不起作用--我确实尝试过)。
我觉得这是操作系统中的一个错误,但我想向SO群体提出这个问题以获得第二意见,并查看是否有任何解决方法。有什么想法吗?

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

7个回答

13

我花了很多时间,但终于觉得我把它搞定了。

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

这是否仍然算作一个 Bug?也许吧。至少苹果的 SDK 文档应该更新。我已经向苹果提交了一个错误报告 (rdar://6462725)。


哇,我刚刚在我的应用程序中注意到了同样的问题。我尝试了你的技巧,现在它运行得很好,谢谢!此外,我不得不使tableView:canEditRowAtIndexPath:和tableView:canMoveRowAtIndexPath:返回NO,这样表格看起来就不像处于编辑模式! - squelart
感谢你们俩提供了这个解决方案。 - Dan Morgan
UITableView没有可编辑的属性,只有UITextField有...你是在说UITableView上的/editing/属性吗?还是在UITableViewCell上? - Andy Bourassa
抱歉,描述是正确的,但我提到的属性不对。我的意思是UITableView的“editing”属性。我已经更新了我的答案。 - Stephen Darlington
你说:“有时候放大镜不会出现或跟随,但手势似乎总是起作用” - 在模拟器中看来,你必须进行一些垂直移动,才能使放大镜工作。如果只向水平方向移动,它不会显示。看起来像是操作系统的一个bug。 - Michael Baltaks
我也这么认为。苹果将我的错误报告标记为重复,希望他们有朝一日能够修复它。 - Stephen Darlington

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所示不同,您不应该需要处理textfield委托,除非您有多行并且希望响应didSelectRowAtIndexPath事件(当处于编辑模式时似乎不会出现此事件 - 那么您也需要按照他的建议进行操作)。顺便说一下 - 这在SDK3.0中似乎已经修复了(尽管可能会更改)。

0

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

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

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

在文本字段委托中,您不需要做任何事情。


0

听起来像是操作系统的一个bug。我建议你尝试使用2.0、2.1和2.2 SDK运行UICatalog示例,看看是否有任何变化。(如果你为2.2构建,会出现与表格单元文本对齐相关的错误,但如果你为2.1构建,则不会出现,无论设备上的操作系统版本是什么。)

如果最终发现确实有差异,https://bugreport.apple.com/


谢谢您的建议。我一定会尝试使用不同版本的SDK进行构建。我曾经认为是代码运行的操作系统版本,但当然,你知道,当你做出假设时... - Stephen Darlington

0

我在我的应用程序中尝试了这个方法,看起来效果符合预期。每次都会出现放大镜。我正在使用2.1 SDK。


有趣。那么你使用的UITableView、UITableViewCell和UITextField与UICatalog示例中的有什么不同? - Stephen Darlington

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接