2011-07-23 9 views
3

私は、UITextFieldへの入力としてUIActionSheet内にUIDatePickerViewを持っています。キーボードの代わりに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]; 

}

今私の問題は、最初のユーザーが、通常のテキストフィールドをタップしましょう、です。キーボードをポップアップ表示します。終了ボタンを選択せず​​に、日付フィールドをタップします。アクションシートがポップアップ表示されます(キーボードを外すことなく)。アクションシートを隠した後、ユーザーは他のテキストフィールドをタップし、キーボードのリターンキーをクリックしなければなりません。

アクションシートがポップアップする場合は、キーボードを非表示にしたいですか?

答えて

7

アクションシートを表示するときに、resignFirstResponderと入力します。テキストフィールドが複数ある場合は、UITextFieldタイプのインスタンス変数を.hファイルに作成します。方法:

UITextField *currentTextField; 

次に、あなたはtextFieldDidBeginEditingに現在のテキストフィールドの参照を保持することができます。

- (void)textFieldDidBeginEditing:(UITextField *)textField { currentTextField = textField; .... 

そして、[currentTextField resignFirstResponder]
showDatePicker でメソッドを呼び出します。

- (void)showDatePicker { 

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

EDIT: @Samuelグッドウィンは正しいです。テキストフィールドを追跡する必要はありません。キーボードを閉じるには、次の操作を行うだけです。

- (void)showDatePicker { 

    [self.view endEditing:YES]; 
    ... 
+0

テキストフィールドをトラッキングする必要はありません。不要なインスタンス変数。 –

0

EmptyStackによって提案された方法は、(Xcodeの4.2を使用して)私のために動作しませんでした。メッセージ[currentTextField resignFirstResponder]をメソッドwillPresentActionSheet:(UIActionSheet *)actionSheetに入れましたが、これも機能しませんでした。その後、私はactionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndexにメッセージを入れ、それはトリックを行った...奇妙な!

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

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

} 
2

あなたが何らかの理由でキーボードを閉じたい場合は、単に実行します。

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

はどこでも、どこでも、すべてのテキストフィールドのために働きました。

+0

私は他のヒントを試みたが、これは魅力のように働いている。私の側では、関数はパラメータ "target"ではなく、[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder)to:nil from:nil forEvent:nil]; – tryp

0

私はこれが非常に古い投稿であることを知っていますが、私は私のために働いた解決策を追加すると思っていました(他の人はしませんでした)。私はテキストフィールドを最初のレスポンダに再割り当てしなければならないことを発見しました。どのテキストフィールドが最初のレスポンダのステータスを失うかは問題ではありません。これはそのキーボードを捨てる方法です。

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

正常です。

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