我有一个用于从远程服务器搜索数据的模态窗口 - 它有一个UITextField作为窗口导航栏的titleControl,以及填充窗口的tableview(显然显示结果)。现在我想要做的是当用户滚动tableview时,立即让文本域失去焦点(辞职第一响应者),以便键盘解散并且用户有更多空间滚动浏览桌面视图(它向下延伸以填补空白通过键盘)。基本上与使用UISearchDisplayController(或其他任何名称)时的功能相同。
所以我有这个代码来检测tableview的滚动事件:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[searchField resignFirstResponder];
}
哪个工作正常。但是,问题在于,一旦用户滚动表格并且文本字段失去焦点,您就无法通过再次点击它来重点关注它。所以基本上一旦我调用[resignFirstResponser]
,我就再也无法重新启动键盘并编辑文本字段值。任何人都知道为什么?我是否需要在某个地方明确调用[becomeFirstResponder]
?因为我认为在点击字段时会自动处理?
同样值得注意的是 - 当我第一次调出模态窗口时,我正在文本字段上调用[becomeFirstResponder]
,因此该字段是预先聚焦的。这与它有什么关系吗?
如果有人愿意,我可以发布更多代码,但我不认为我在文本字段中做了一些与众不同的事情。
感谢您的帮助!
答案 0 :(得分:1)
您正在从一个函数调用resignFirstResponder
,每次滚动UIScrollview
时都会调用该函数。因此它没有出现。当uitextview失焦时,您需要调用resign。
您可以执行以下操作。它是一个黑客:
这样您就可以删除错误,即调用scrollViewWillBeginDragging
中的方法。
其他选项是覆盖viewDidAppear
的<{1}}方法。
或者您可以将文本字段放入不同的容器中,并通过检查哪个scrollview发送消息来处理scrollViewWillBeginDragging。
答案 1 :(得分:1)
你为searchField设置了一个委托吗?我遇到过同样的问题。我弹出一个模型视图,并将文本字段设置为viewDidLoad中的第一个响应者。一切都很好,第一次。但是一旦我解除模态视图控制器,并重新打开它。我的文本字段不再被聚焦。
我发现它与UITextFieldDelegate的方法有关。删除方法的实现后
– textFieldShouldEndEditing:
– textFieldDidEndEditing:
一切顺利。但不知道为什么
答案 2 :(得分:1)
您是否正在使用“textFieldShouldEndEditing”执行任何操作,例如@fengd?
我遇到的一个问题是我正在查看模态视图,而我的“textFieldShouldEndEditing”例程在特定文本字段上错误地返回“NO”。当我的模态被解雇时,我将无法点击任何其他文本字段,大概是因为旧的文本字段仍然是“第一响应者”。因为它永远不会结束编辑,所以它会污染其后的所有其他文本字段。
我意识到这是事后2年,但也许其他人可能觉得这很有用。