我在获取文本字段来接受beginFirstResponder指令时遇到问题。
我提供了一种自定义机制,可在导航栏中创建标题。我有另一个成功使用此相同技术的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成为后台线程上的选择器?
[textField performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil
waitUntilDone:YES];
基本原理:在除主线程之外的方法上调用UIKit方法(即更新视图)将不起作用。 。这可能正在发生。 (尚不清楚从何处调用addTitleTextField方法)。
是否有其他第一响应者需要一些时间才能辞职?
[textField performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
原理:如果另一个字段挂在第一响应者上(或正在将其辞职),它将通过等待下一个运行循环来腾出时间清理辞职。 。 。 。 。通常,下一个运行循环将有足够的时间供前一个响应者清理,或者您可以尝试使用诸如0.05之类的短暂延迟。