UITextField不会成为FirstResponder

我有问题让一个文本字段接受becomeFirstResponder指令。

我提供了一个自定义机制来在导航栏中创build一个标题。 我有另一个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 canBecomeFirstResponder是否返回YES,但我仍然无法使其接受firstResponder的顺序。 有任何想法吗? Docs说:“如果当前响应者可以辞退第一响应者状态(canResignFirstResponder)并且新响应者可以成为第一响应者,则响应者对象只成为第一响应者”。

你是否告诉UITextField在后台线程上变成select器?

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

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

还有另外一个急救员需要一些时间来辞职吗?

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

理由 :如果另一个领域挂在第一响应者身上(或者是在辞职的过程中),通过等待直到下一个运行循环,它会给予时间清理一个辞职。 。 。 。 。 通常下一个运行循环将有足够的时间让前面的响应者清理,或者你可以尝试一个像0.05这样的短暂延迟。

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

 v.addSubview(textField)