在我的应用程序中,我在UITextField
内有一个UITableViewCell
。如果我在文本字段内单击并添加一些文本,我发现如果尝试移动插入点,它会在第一次工作但在后续尝试时失败。我完全无法移动选择;没有“放大镜”出现。
更奇怪的是,这个“设置”似乎是永久性的,直到我重新启动应用程序。它会影响该屏幕上的所有UITextFields
,而不仅仅是我最初尝试编辑的那个。
如果您想亲眼看到它,请尝试iPhone SDK附带的“UICatalog”示例。单击“文本字段”,然后“编辑”并使用文本框。
我已经做了很多挖掘,但谷歌很难做到!我发现的最好的参考资料是Apple's support board和MacRumors formum(两者都参考了一个显然曾经用于iPhone 2.0的解决方案,但不适用于当代版本 - 我确实尝试过)。
我的感觉是,这是操作系统中的一个错误,但我想我会把它扔到SO人群中以获得第二意见,看看是否有任何变通方法。有任何想法吗?
根据benzado的建议,我尝试使用2.0,2.1和2.2 SDK构建我的应用程序。我在所有版本中都有相同的行为。 (实际上,相关但不相同的东西在2.2中破裂但这可能是另一个问题!)
我花了很多时间在这上面,但我终于认为我把它固定了。
诀窍是表格需要是可编辑的(即,它的editing
属性需要设置为YES
)。好消息是您现在可以移动插入点。有时放大镜没有出现或跟随,但你的手势似乎总是有效。
这还有资格作为错误吗?也许。至少应该更新Apple的SDK文档。我已经向Apple提出了一个错误报告来覆盖这个(rdar:// 6462725)。
感谢这篇文章,我已经能够成功地在我的应用程序中正常工作。
但是要添加一些东西:
如果将表设置为可编辑,则可能会出现与预期不同的行为(缩进,编辑窗口小部件,没有披露指示符等)。这令我感到惊讶,但这里是如何最好地处理它:
在您的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.
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中修复(虽然我想改变)
它听起来像一个OS bug。我会尝试通过针对2.0,2.1和2.2 SDK运行UICatalog示例来重现它,以查看是否有任何更改。 (如果您为2.2构建,则会出现与表单元格文本对齐相关的错误,但如果您为2.1构建,则会发生错误,无论设备上的操作系统版本是什么。)
如果事实证明有所作为,https://bugreport.apple.com/
我用我的应用程序尝试了这个,它似乎按预期工作。我每次都会放大镜。我正在使用2.1 SDK。
实际上最好的方法似乎是在“viewDidLoad”中将表“editing”属性设置为true并将这些属性添加到表委托中
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
您不需要在文本字段委托中执行任何操作
在iOS 12或更高版本中,您可以在故事板中选择表格视图单元格,然后在属性检查器中启用“用户交互”。