tableView 重新加载数据失去文本字段焦点

问题描述 投票:0回答:4

我有一些带有文本字段和其他标签的单元格。基本上,用户使用键盘输入数据后,他们可以导航到另一个文本字段(通过各种方式),我将他们希望转到的文本字段保存在指针中,然后设置触发文本字段的 didEndEditing 方法的第一个响应者。在 didEndEditing 中,我调用刷新方法来重新加载 tableData 以更新各种标签,然后我尝试再次将 FirstResponder 设置为我存储的文本字段。

最终结果是键盘保留在屏幕上,但文本字段没有获得焦点。但是,如果您再试一次,第二次就会起作用...

这是一些代码。请记住,很多涉及计算和日志等的内容已被删除。我只添加了与此问题相关的内容。

编辑另外,我知道我提到过我正在使用箭头按钮进行导航。如果您不使用箭头按钮,问题也在这里。您必须手动按(或单击)一个文本字段两次才能在离开另一个文本字段后获得焦点。

 //user presses an arrow button to enter textfield

 //logic is done here to find what the next textfield would be

 _nextTextFieldSelection = (UITextField *)[[_tableView cellForRowAtIndexPath:destinationIndexPath] viewWithTag:newTag];
[_nextTextFieldSelection becomeFirstResponder];


- (void)textFieldDidEndEditing:(UITextField *)textField
{
     //some stuff for calculations
     [self refreshScreen]
}

- (void)refreshScreen
{
    [_tableView reloadData]; 
    //set tables values

    [_nextTextFieldSelection becomeFirstResponder];
}
ios objective-c cocoa-touch
4个回答
1
投票

重新加载表格时,会重新创建单元格。您缓存的

nextTextFieldSelection
可能不再是对正确文本字段实例的引用。尝试缓存indexPath而不是文本字段,然后使用标签从给定索引路径的单元格中获取适当的文本字段。


1
投票

另一种解决方案 - 使用

tableView.insertRows(at: indexPaths, with: .automatic)


0
投票

我面临着同样的问题 - 在表视图重新加载数据后失去焦点。 但是在 tableview reloadData 方法之后添加 cellForRowAtIndexPath 解决了这个问题。这个答案已经在评论中给出,但考虑在此处添加以获得更多可见性。


0
投票

对我来说,这个解决方案非常不常见。我设法将

dataSource
替换为
DiffableTableViewDataSource

这允许您通过更改

dataSource
中的数据来更改 tableView 外观,而无需调用
tableView.reloadData()
,因为在幕后它使用
apply
方法进行快照并应用差异

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