如果要弹出操作表,请关闭键盘

时间:2011-07-23 09:17:27

标签: iphone ios uitextfield uiactionsheet uitextfielddelegate

我在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];

}

现在我的问题是,让我们说第一个用户点击普通文本字段。哪个会弹出键盘。然后,如果没有选择完成按钮,他会点击日期字段。哪个会弹出操作表(不解除键盘)。隐藏动作表后,用户必须点击其他文本字段并单击键盘的返回键。

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

6 个答案:

答案 0 :(得分: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];
    ...

答案 1 :(得分:3)

如果您想以任何理由解雇键盘,只需执行以下操作:

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

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

答案 2 :(得分:0)

EmptyStack提出的方法对我不起作用(使用xcode 4.2)。我在方法[currentTextField resignFirstResponder]中放置了willPresentActionSheet:(UIActionSheet *)actionSheet消息,但也没有用。然后我把信息放在actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex中,这就是诡计......奇怪!

答案 3 :(得分:0)

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if ([textField isEqual:txtExpDate]) {

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

}

答案 4 :(得分:0)

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

[self.textfield becomeFirstResponder];
[self.textfield resignFirstResponder];

答案 5 :(得分:0)

工作正常。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    if(textField==myTextField2){
        [myTextField1 resignFirstResponder];
        [self showActionSheet];
        return NO;
    }
    return YES;      
}