【问题标题】:Make UITextField first responder使 UITextField 成为第一响应者
【发布时间】:2013-10-22 00:35:44
【问题描述】:

在单元测试中,我试图在 UITextField 上调用 becomeFirstResponder 方法,但我得到 NO,即它没有成为第一响应者。

代码如下:

UITextField *textField = [self.controller.searchBar valueForKey: @"_searchField"];
//    textField = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 10.0, 400.0, 44.0)];
[self.navigationController.navigationBar addSubview:textField];

textField.enabled = YES;
STAssertTrue([textField becomeFirstResponder],
             @"TextField should be a first responder.");

我错过了什么吗?

【问题讨论】:

  • 根据您正在调用的对象生命周期的时刻,self.navigationCopntroller.navigationBar 可能 == nil。如果是这样,NO 是正确的行为。

标签: ios objective-c uitextfield becomefirstresponder


【解决方案1】:

您正在获取文本字段搜索栏的值:

UITextField *textField = [self.controller.searchBar valueForKey: @"_searchField"];

但是你只是忽略那个值,并用这个覆盖它:

textField = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 10.0, 400.0, 44.0)];

您还没有将这个新的文本字段添加到任何视图中,它只是一个已分配的单独文本字段,仅此而已。它不能成为第一响应者,因为它不是应用程序的一部分。

有更好的方法可以访问搜索栏。

您可以使用 searchTextPositionAdjustment 和 searchFieldBackgroundPositionAdjustment 等调用来更改搜索项的位置。您可以使用UISearchBarDelegate 来获取有关正在输入的文本的信息。

它怎么会因为你得到它的引用而成为第一响应者?也许您打算使用 isFirstResponder(它已经是第一响应者)或 canBecomeFirstResponder(它可以成为第一响应者)。

否则,您需要在 UITextFieldTextDidBeginEditingNotification 上设置 NSNotification 以在开始编辑时收到通知。

【讨论】:

  • 我修改了上面的代码。我尝试将 textField 作为子视图添加到导航栏。但它仍然不能作为第一响应者。我正在为我的代码使用搜索栏委托方法,但我有一个代码可以处理使用 UITextField 的搜索栏上的光标定位。我正在对需要 UITextField 作为执行某些操作的第一响应者的代码进行单元测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多