UITextField不会成为FirstResponder

时间:2013-06-08 19:29:11

标签: ios objective-c cocoa-touch

我在获取文本字段以接受becomeFirstResponder指令时遇到问题。

我正在提供一种自定义机制来在导航栏中创建标题。我有另一个成功使用相同技术的viewcontroller。在viewDidAppear上我开火:

- (void)addTitleTextField
{
    CGRect textFrame = self.parentViewController.navigationController.navigationBar.frame;
    textFrame.size.width = 300.0;
    textFrame.origin.y = (768.0 - 300.0)/2;
    textFrame.size.height = 30.0;
    textFrame.origin.x = 7.0;
    self.titleTextField = [[UITextField alloc] initWithFrame:textFrame];
    self.titleTextField.placeholder = NSLocalizedString(@"New Multiple Choice Quiz", @"New Multiple Choice Quiz");
    self.titleTextField.borderStyle = UITextBorderStyleRoundedRect;
    self.titleTextField.font = [UIFont boldSystemFontOfSize:20.0];
    self.titleTextField.textAlignment = NSTextAlignmentCenter;
    self.titleTextField.backgroundColor = [UIColor whiteColor];
    self.titleTextField.textColor = [UIColor blackColor];
    self.titleTextField.delegate = self;
    [self.titleTextField setAutocorrectionType:UITextAutocorrectionTypeNo];
    self.titleTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
    [self.titleTextField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
    self.activeTextField = self.titleTextField;
    self.parentViewController.navigationItem.titleView = self.titleTextField;
    [self.titleTextField becomeFirstResponder];
}

self.titleTextField将允许我设置文本值,但如果使用canBecomeFirstResponder进行检查,则返回NO。如您所见,我在parentViewController上设置它。我已经尝试使用委托来尝试让parentViewController进行设置。当我执行委托并检查textField是否可以成为第一个响应者时它返回YES,但我仍然无法让它接受firstResponder顺序。有任何想法吗? Docs说“如果当前响应者可以辞退第一响应者状态(canResignFirstResponder)并且新响应者可以成为第一响应者”,则响应者对象仅成为第一响应者。

3 个答案:

答案 0 :(得分:6)

您是否告诉UITextField成为后台线程的选择器?

[textField performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil 
  waitUntilDone:YES];

基本原理:在主线程以外的方法上调用UIKit方法(即更新视图)将不起作用。 。这可能会发生。 (目前尚不清楚从哪里调用addTitleTextField方法)。

还有另一位需要一段时间辞职的第一响应者吗?

[textField performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];

基本原理:如果另一个字段挂在第一个响应者身上(或者在重新签名的过程中),它会给你时间来清理一个辞职,等到下一个运行循环。 。 。 。 。通常下一个运行循环将有足够的时间让前一个响应者清理,或者你可以尝试像0.05这样的短暂延迟。

答案 1 :(得分:0)

您可能需要添加textField以查看层次结构:

v.addSubview(textField)

答案 2 :(得分:0)

另一件事是确保已启用textField (检查Interface Builder,然后通过代码进行任何禁用操作)。

我花了将近一个小时的时间来弄清楚问题出在哪里:我通过子类化UITextField并将canBecomeFirstResponder重写为始终return true来解决问题。这迫使它最终显示键盘并编辑textField,但是我注意到我无法点击/选择/复制/粘贴textField。启用了用户交互功能,然后我终于看到未选中“启用” ...我责怪苹果公司在禁用部分UI(例如与“隐藏”操作时)没有显示任何视觉提示