1

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

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

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

哪个工作正常。但是,问题在于,一旦用户滚动表格并且文本字段失去焦点,您就无法通过再次点击它来将焦点归还给它。所以基本上,一旦我打电话,[resignFirstResponser]我就再也无法恢复键盘并编辑文本字段值了。有人知道为什么吗?我是否需要[becomeFirstResponder]在某处明确调用该字段?因为我认为在点击该字段时会自动处理?

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

如果有人愿意,我可以发布更多代码,但我不认为我在使用文本字段做任何不寻常的事情。

谢谢你的帮助!

4

3 回答 3

1

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

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

  1. 每当您专注于 UITextField 时,都会创建一个不可见的按钮来覆盖您的滚动视图。
  2. 捕获按钮按下事件并辞职第一响应者
  3. 每当 uitextfield 成为第一响应者时,创建按钮

这样您将删除错误,即在scrollViewWillBeginDragging. 其他选择是覆盖viewDidAppear.uiTextField

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

于 2011-07-23T21:01:26.417 回答
1

你为你的searchField设置了一个代表吗?我遇到过同样的问题。我弹出一个模型视图,并将文本字段设置为 viewDidLoad 中的第一响应者。一切都是第一次运行良好。但是一旦我关闭模态视图控制器,然后重新打开它。我的文本字段不能再集中了。

我发现它与 UITextFieldDelegate 的方法有关。一旦我删除了方法的实现

– textFieldShouldEndEditing:
– textFieldDidEndEditing:

一切正常。但不知道为什么

于 2011-08-07T07:21:12.443 回答
1

你在用“textFieldShouldEndEditing”做任何事情吗,比如@fengd?

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

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

于 2013-08-19T19:37:21.887 回答