iPhone-在UITextField上辞职第一响应者后,无法重新聚焦它

时间:2011-07-23 20:49:32

标签: iphone uitableview uitextfield first-responder

我有一个用于从远程服务器搜索数据的模态窗口 - 它有一个UITextField作为窗口导航栏的titleControl,以及填充窗口的tableview(显然显示结果)。现在我想要做的是当用户滚动tableview时,立即让文本域失去焦点(辞职第一响应者),以便键盘解散并且用户有更多空间滚动浏览桌面视图(它向下延伸以填补空白通过键盘)。基本上与使用UISearchDisplayController(或其他任何名称)时的功能相同。

所以我有这个代码来检测tableview的滚动事件:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [searchField resignFirstResponder];
}

哪个工作正常。但是,问题在于,一旦用户滚动表格并且文本字段失去焦点,您就无法通过再次点击它来重点关注它。所以基本上一旦我调用[resignFirstResponser],我就再也无法重新启动键盘并编辑文本字段值。任何人都知道为什么?我是否需要在某个地方明确调用[becomeFirstResponder]?因为我认为在点击字段时会自动处理?

同样值得注意的是 - 当我第一次调出模态窗口时,我正在文本字段上调用[becomeFirstResponder],因此该字段是预先聚焦的。这与它有什么关系吗?

如果有人愿意,我可以发布更多代码,但我不认为我在文本字段中做了一些与众不同的事情。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您正在从一个函数调用resignFirstResponder,每次滚动UIScrollview时都会调用该函数。因此它没有出现。当uitextview失焦时,您需要调用resign。

您可以执行以下操作。它是一个黑客:

  1. 每当您专注于UITextField时,都会创建一个隐藏按钮以覆盖您的滚动视图。
  2. 捕获按钮按下事件并辞职第一响应者
  3. 每当uitextfield成为第一响应者时,创建按钮
  4. 这样您就可以删除错误,即调用scrollViewWillBeginDragging中的方法。 其他选项是覆盖viewDidAppear的<{1}}方法。

    或者您可以将文本字段放入不同的容器中,并通过检查哪个scrollview发送消息来处理scrollViewWillBeginDragging。

答案 1 :(得分:1)

你为searchField设置了一个委托吗?我遇到过同样的问题。我弹出一个模型视图,并将文本字段设置为viewDidLoad中的第一个响应者。一切都很好,第一次。但是一旦我解除模态视图控制器,并重新打开它。我的文本字段不再被聚焦。

我发现它与UITextFieldDelegate的方法有关。删除方法的实现后

– textFieldShouldEndEditing:
– textFieldDidEndEditing:
一切顺利。但不知道为什么

答案 2 :(得分:1)

您是否正在使用“textFieldShouldEndEditing”执行任何操作,例如@fengd?

我遇到的一个问题是我正在查看模态视图,而我的“textFieldShouldEndEditing”例程在特定文本字段上错误地返回“NO”。当我的模态被解雇时,我将无法点击任何其他文本字段,大概是因为旧的文本字段仍然是“第一响应者”。因为它永远不会结束编辑,所以它会污染其后的所有其他文本字段。

我意识到这是事后2年,但也许其他人可能觉得这很有用。