添加[myUITextField becomeFirstResponder];不会带来键盘

时间:2012-02-10 01:41:02

标签: ios uitextfield uikeyboard

我已经创建了一个包含UITextField的屏幕。当我得到一个EditingDidBegin事件时,我resignFirstResponder,在其中添加另一个textField的Popover,并为该TextField调用其上的BecomeFirstResponder。

当它运行时,我得到闪烁插入指针和X清除内容。虽然没有键盘。 Master UIView设置为UserInteractionEnabled:YES。

第一个UITextField的目标操作,它在自己的视图上。

[textField addTarget:self action:@selector(wantsToEditValue:) forControlEvents:UIControlEventEditingDidBegin];

目标动作选择器:

- (IBAction)wantsToEditValue:(id)sender {
// set notification so we can update from popover
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(saWriteValue:)
                                             name:kRefreshFromPopover object:nil];

    //we dont want the TagValue textfield to really be the first responder.
[textField resignFirstResponder];


    [... setup popoverVC, and View. present popover...]

}

以下是创建第二个UITextField的代码。此代码位于Popover的VC中..

- (void)viewDidLoad
{
if (IoUIDebug & IoUIDebugSelectorNames) {
    NSLog(@"%@ - %@", [self description], NSStringFromSelector(_cmd) );
}    [super viewDidLoad];

[self createElementInputControl];
[self createWriteButton];

    //We want the input Focus
     [textFieldInput becomeFirstResponder];


    //Resize our view to handle the new width
CGRect newViewSize = CGRectMake(self.view.frame.origin.x, 
                                self.view.frame.origin.y, 
                                writeButton.frame.origin.x + writeButton.frame.size.width + kWriteElementOffset , 
                                self.view.frame.size.height);

[self.view setFrame:newViewSize];
}

创建输入代码:

-(void) createElementInputControl {


 textFieldInput = [[UITextField alloc] initWithFrame:CGRectMake( kWriteElementOffset   ,
                                                                            kWriteElementHeightOffset, 
                                                                            kTagValueInputInitialWidth,
                                                                            kWriteElementDefaultHeight)];

textFieldInput.borderStyle = UITextBorderStyleRoundedRect;
textFieldInput.clearButtonMode = UITextFieldViewModeWhileEditing;
textFieldInput.textAlignment = UITextAlignmentLeft;
[textFieldInput setDelegate:self];
[textFieldInput setKeyboardType:UIKeyboardTypeDefault];

    // Set the value of the text
[textFieldInput setText:self.myTag.value];

CGSize textFieldInputSize  = [textFieldInput.text sizeWithFont:textFieldInput.font];

    //Set the Button Width
[textFieldInput setFrame:CGRectMake(textFieldInput.frame.origin.x, textFieldInput.frame.origin.y, textFieldInputSize.width + kTagValueInputWidthBuffer, textFieldInput.frame.size.height)];

[self.view addSubview:textFieldInput];
}

当我删除了becomeFirstResponder代码时,Popover正常,但没有闪烁的插入指针。我点击该字段,我得到插入指针,X清除内容按钮,是键盘。

我希望键盘显示而无需单击新的文本字段。

谢谢!

2 个答案:

答案 0 :(得分:1)

要成为第一响应者,视图必须位于视图层次结构中。 您需要将textFieldInput作为子视图添加到某个内容中。

根据Apple在UIResponder中的文档:

  

您可以调用此方法来创建响应者对象,例如查看第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则视图将从任何层次结构中分离。

答案 1 :(得分:0)

当您从didBeginEditing调用成为第一响应者时,您将遇到无限循环。原因是,当您调用becomeFirstResponder时,它会调用didBeginEditing。所以它解释了光标闪烁和你的陈述

  

当我删除了becomeFirstResponder代码时,Popover出现了   正常,但没有闪烁的插入指针。我得到了领域   插入指针,X清除内容按钮,是键盘。

要解决您的问题,

在beginEditingMethod中,

if(texfield.tag == firstTextFieldTag)
{
//Create second TextField and make it become first responder
}
else
{
// do want you want in the beginEditing of your second textfield.
}