2

我不想显示键盘,而是在选择 textField 时显示弹出视图(我的代码在底部)。如果键盘没有显示,那么一切都很好。但是,如果键盘正在显示,然后选择了文本字段,则键盘不会被关闭,那么 firstResponders 一定会迷路,但我不知道在哪里。有人对此有解决方案吗?

我的文本字段:

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

5 回答 5

10

这很容易做到,使用您的 UITextFieldDelegate 方法,特别是 UITextFieldShouldBeginEditing 并返回 NO 并执行代码以显示弹出框。这样,键盘就不会从一开始就显示出来。

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

于 2012-04-09T16:56:04.400 回答
1

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

[self.startDateTextField resignFirstResponder];

编辑: 但是,当您单击文本字段时,不要放弃键盘,您可以为 Textfield 制作诸如 setInputView 之类的东西来带出 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;
于 2012-04-07T08:00:10.080 回答
1

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

相反,您应该使用该endEditing类别递归所有视图的子视图,以从它附加到的任何视图中退出第一响应者:

[self.view endEditing:YES];

在任何情况下,由于您不想显示键盘,您可以简单地实现UITextFieldDelegate以覆盖默认行为。

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

    return NO;
}

UITextFieldDelegate 协议参考。

于 2012-04-09T16:59:05.127 回答
0

因此,您试图在选择文本字段后立即隐藏键盘并显示其他内容?

我能想到的有两点:

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

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

于 2012-04-09T16:42:20.213 回答
-1

如果inputView在文本字段上没有得到你想要的,你也可以简单地在顶部放置一个不可见的按钮,UITextField然后从按钮的操作中显示弹出框。对用户来说,它看起来好像文本字段弹出了弹出框。如果此时键盘仍然存在,请呼叫resignFirstResponder所有可能的第一响应者(文本字段等)。

于 2012-04-09T16:52:51.053 回答