键盘没有响应resignFirstResponder

时间:2012-04-07 03:07:46

标签: ios uitextfield resignfirstresponder

当选择textField时,我想显示一个弹出视图,而不是显示键盘(我的代码位于底部)。如果键盘没有显示,那么一切都很好。但是,如果键盘正在显示然后选择了文本字段,键盘就不会被解雇,某个地方的第一个响应者必须迷路但我不知道在哪里。有人有解决方案吗?

我的文字字段:

    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];
}

5 个答案:

答案 0 :(得分:9)

这很容易做到,使用你的UITextFieldDelegate方法特别是UITextFieldShouldBeginEditing并返回NO并执行代码来显示popover。这样,键盘永远不会显示开始。

- (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调用。

答案 1 :(得分:1)

您似乎正在辞职文本字段的第一个响应者;然而,这不一定是第一响应者,这可以解释为什么调用它没有效果。

相反,您应该使用endEditing类别来递归视图中的所有子项,以便从第一个响应者的任何视图中重新签名:

[self.view endEditing:YES];

在任何情况下,由于您永远不想显示键盘,您只需实现UITextFieldDelegate即可覆盖默认行为。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Your popover code.

    return NO;
}

UITextFieldDelegate Protocol Reference.

答案 2 :(得分:0)

editStartDate:方法

中尝试这样做
[self.startDateTextField resignFirstResponder];

修改 但是,当您在文本字段中单击时,您可以使用类似setInputView for 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;

答案 3 :(得分:0)

所以你试图在选择文本字段后立即隐藏键盘并显示其他内容吗?

我能想到两件事:

  1. 在辞职第一响应者之前,给文本字段一些时间将它们放在一起: [textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];

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

答案 4 :(得分:-1)

如果文本字段中的inputView无法满足您的需求,您还可以在UITextField的顶部放置一个隐藏按钮,只显示按钮操作的弹出窗口。对于用户来说,它看起来好像文本字段带来了弹出窗口。如果此时键盘仍然存在,请在所有可能的第一响应者(文本字段等)上调用resignFirstResponder