键盘没有响应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文本字段后立即隐藏键盘并显示其他内容?
有两件事我可以想到:
-
在
[textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];
第一个响应者之前,给文本字段一些时间来获取它:[textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];
-
将文本字段的
inputView
属性设置为nil或具有清晰背景色的UIView
。
如果在文本字段上的inputView
没有得到你想要的,你也可以简单地把一个隐形的button放在UITextField
顶部,只显示button动作的popup窗口。 对用户来说,它会显示为文本字段带来了popup窗口。 如果此时键盘仍然存在,请在所有可能的第一响应者(文本字段等)上调用resignFirstResponder
。