4

我在 UIActionSheet 中有一个 UIDatePickerView 作为 UITextField 的输入。当专注于 UITextField UIActionSheet 将弹出而不是键盘。单击 UIActionSheet 中的完成按钮时,它将隐藏。我还有其他几个文本字段表现正常(显示键盘)。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    if ([textField isEqual:txtExpDate]) {
        [textField resignFirstResponder];
        [self showDatePicker];
    }
}


- (void) showDatePicker{
    UIActionSheet *datePickerActionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Done" otherButtonTitles:nil];
    datePickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 80, 0, 0)];
    datePickerView.datePickerMode = UIDatePickerModeDate;
   [datePickerActionSheet addSubview:datePickerView];
   [datePickerActionSheet showInView:self.navigationController.view];
   [datePickerActionSheet setBounds:CGRectMake(0, 0, 320, 500)];
   [datePickerActionSheet release];

}

现在我的问题是,假设第一个用户点击普通文本字段。这将弹出键盘。然后在没有选择完成按钮的情况下,他点击日期字段。这将弹出操作表(不关闭键盘)。隐藏操作表后,用户必须点击其他文本字段并单击键盘的返回键。

如果要弹出操作表,我想隐藏键盘?

4

6 回答 6

7

当您要调出操作表时,将文本字段设为 resignFirstResponder 。如果您有多个文本字段,请在.h文件中创建一个 UITextField 类型的实例变量。

UITextField *currentTextField;

然后您可以在textFieldDidBeginEditing:方法中保留对当前文本字段的引用。

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    currentTextField = textField;
    ....

并且,在showDatePicker方法中调用[currentTextField resignFirstResponder] 。

- (void)showDatePicker {

    [currentTextField resignFirstResponder];
    UIActionSheet *datePickerActionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Done" otherButtonTitles:nil];
    ...

编辑: @Samuel Goodwin 是正确的。我们不必跟踪文本字段。我们可以简单地执行以下操作来关闭键盘。

- (void)showDatePicker {

    [self.view endEditing:YES];
    ...
于 2011-07-23T09:21:09.143 回答
3

如果您出于任何原因想关闭键盘,只需执行以下操作:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) target:nil forEvent:nil];

适用于任何地方的所有文本字段。

于 2013-06-24T17:21:17.977 回答
0

EmptyStack 提出的方法对我不起作用(使用 xcode 4.2)。我将消息[currentTextField resignFirstResponder]放在方法willPresentActionSheet:(UIActionSheet *)actionSheet中,这也不起作用。然后我把信息放进去 actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex,就成功了……奇怪!

于 2011-11-25T12:05:39.390 回答
0
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if ([textField isEqual:txtExpDate]) {

        [self showDatePicker];
        return NO;
    }
    return YES;

}
于 2012-08-04T04:30:35.687 回答
0

我知道这是一篇非常古老的帖子,但我只是想添加对我有用的解决方案(其他人没有)。我发现我必须重新分配一个文本字段作为第一响应者,然后再次辞职。哪个文本字段变为然后失去第一响应者状态并不重要,这只是放弃该键盘的一种方式。

[self.textfield becomeFirstResponder];
[self.textfield resignFirstResponder];
于 2013-08-19T11:14:13.563 回答
0

它工作正常。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    if(textField==myTextField2){
        [myTextField1 resignFirstResponder];
        [self showActionSheet];
        return NO;
    }
    return YES;      
}
于 2014-10-13T09:48:29.953 回答