键盘没有响应resignFirstResponder

当selecttextField(我的代码在底部)时,我不想显示键盘,而想显示popup视图。 如果键盘没有显示,那么一切正常。 但是,如果键盘显示,然后select文本字段键盘不会被解雇,某个地方firstResponders必须迷路,但我不知道在哪里。 有没有人有这个解决scheme?

我的文本框:

self.startDateTextField = [[UITextField alloc] initWithFrame:CGRectMake(79, 148, 138, 27)]; [self.startDateTextField setBorderStyle:UITextBorderStyleRoundedRect]; [self.startDateTextField setDelegate:delegate]; [self.startDateTextField addTarget:delegate action:@selector(editStartDate:) forControlEvents:UIControlEventEditingDidBegin]; [popoverWrapper addSubview:self.startDateTextField]; 

并在editStartDate:我有:

 -(void)editStartDate:(UITextField *)textField { [textField resignFirstResponder]; DatePickerVC *datePickerVC = [[DatePickerVC alloc] init]; datePickerVC.delegate = self; self.popoverController = [[UIPopoverController alloc] initWithContentViewController:datePickerVC]; [self.popoverController setDelegate:self]; [self.popoverController presentPopoverFromRect:CGRectMake(0, 0, 5, 5) inView:textField permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; } 

这很容易做,使用你的UITextFieldDelegate方法,特别是UITextFieldShouldBeginEditing,并返回NO并执行代码来显示popup窗口。 这样键盘从不显示开始。

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { [self.view endEditing:YES]; // added this in for case when keyboard was already on screen [self editStartDate:textField]; return NO; } 

为了确保将textField的委托设置为self(视图控制器),并在您的editStartDate方法中删除了resignFirstResponder调用。

你似乎在辞职的文本领域的第一响应者; 然而,这不一定是第一响应者,这可以解释为什么称呼它没有效果。

相反,您应该使用endEditing类别recursion视图中的所有子项,以便从所附视图中的任何一个视图中辞去第一个响应者:

 [self.view endEditing:YES]; 

在任何情况下,因为你永远不想显示键盘,你可以简单地实现UITextFieldDelegate来覆盖默认的行为。

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { // Your popover code. return NO; } 

UITextFieldDelegate协议参考。

在你的editStartDate:方法中尝试像这样

 [self.startDateTextField resignFirstResponder]; 

编辑:但是,而不是在键入单击文本框时,您可以使类似setInputView为Textfield带出popViewController。

 DatePickerVC *datePickerVC = [[DatePickerVC alloc] init]; datePickerVC.delegate = self; self.popoverController = [[UIPopoverController alloc] initWithContentViewController:datePickerVC]; [self.popoverController setDelegate:self]; [self.popoverController presentPopoverFromRect:CGRectMake(0, 0, 5, 5) inView:textField permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; self.startDateTextField = [[UITextField alloc] initWithFrame:CGRectMake(79, 148, 138, 27)]; [self.startDateTextField setBorderStyle:UITextBorderStyleRoundedRect]; [self.startDateTextField setDelegate:delegate]; self.startDateTextField.inputView = self.popoverController; 

所以你想在select文本字段后立即隐藏键盘并显示其他内容?

有两件事我可以想到:

  1. [textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];第一个响应者之前,给文本字段一些时间来获取它: [textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];

  2. 将文本字段的inputView属性设置为nil或具有清晰背景色的UIView

如果在文本字段上的inputView没有得到你想要的,你也可以简单地把一个隐形的button放在UITextField顶部,只显示button动作的popup窗口。 对用户来说,它会显示为文本字段带来了popup窗口。 如果此时键盘仍然存在,请在所有可能的第一响应者(文本字段等)上调用resignFirstResponder