当选择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];
}
答案 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;
}
答案 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)
所以你试图在选择文本字段后立即隐藏键盘并显示其他内容吗?
我能想到两件事:
在辞职第一响应者之前,给文本字段一些时间将它们放在一起:
[textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];
将文本字段的inputView
属性设置为nil或具有清晰背景颜色的UIView
。
答案 4 :(得分:-1)
如果文本字段中的inputView
无法满足您的需求,您还可以在UITextField
的顶部放置一个隐藏按钮,只显示按钮操作的弹出窗口。对于用户来说,它看起来好像文本字段带来了弹出窗口。如果此时键盘仍然存在,请在所有可能的第一响应者(文本字段等)上调用resignFirstResponder
。