使用deleteRows之后,beginFirstResponer()不会将焦点放在textField上

时间:2019-07-02 00:10:54

标签: ios swift uitableview uitextfielddelegate becomefirstresponder

const onChangeHandler = (key: Fields, value: string) => { switch (key) { case Fields.User: // do something with `value` break; case Fields.Password: // do something with `value` break; case Fields.Country: // do something with `value` break; } }; 从我的表格视图中删除任何行之后,我无法在可重用的自定义单元格中获取文本字段以通过deleteRows(at:with:)来获得焦点(在调用becomeFirstResponder()之后被调用) 。始终在insertRows(at:with:)中调用becomeFirstResponder()

cellForRow(at:)从表视图中删除一行后,总是开始出现此问题。在删除任何行之前没有问题,deleteRows(at:with:)可以按预期将焦点对准文本字段。

我进行了一些测试,以了解删除行后为什么会出现此问题...我的测试显示出有趣的区别:

情况1 :删除任何行后(即,becomeFirstResponder()返回false时),becomeFirstResponder()被称为 之前 textFieldShouldBeginEditing(_:)返回。从未调用cellForRow(at:)

情况2 :另一方面,在删除任何行之前(即textFieldDidBeginEditing(_:)返回true之前),becomeFirstResponder()被称为 AFTER < / em> textFieldShouldBeginEditing(_:)返回。按预期,cellForRow(at:)之后textFieldDidBeginEditing(_:)被调用。

这个问题可能与这种差异有关,但是经过数小时的尝试和研究,我无法解决这个谜。

related Q&A中,建议不要从textFieldShouldBeginEditing(_:)内部重新加载tableView。就我而言,textFieldDidEndEditing()方法有时是在deleteRows(at:with:)内部调用的,有时是从textFieldDidEndEditing()调用的(即向左滑动)。因此,这不能解释我的问题。另一个相关的问答环节可能是this one

CustomCell的类中的

getFocus(),是从TableViewController中的tableView(_:commit:forRowAt:)调用的:

cellForRow(at:)

func getFocus() { if let itemTextField = itemTextField { itemTextField.delegate = self itemTextField.isUserInteractionEnabled = true itemTextField.becomeFirstResponder() } }

cellForRow(at:)

1 个答案:

答案 0 :(得分:0)

请勿在{{1​​}}中调用getFocus,在插入新行时应注意,您可以滚动到新行并在cellForRowAt中调用getFocus

希望能为您提供帮助。