3

終了編集イベントでキーボードを非表示にしたいのですUITextFieldが、どういうわけか次のコードを機能させることができません! 完了ボタンを押すとキーボードが非表示になりますが、完了ボタンを押さUITextFieldないとキーボードが不要な別の場所に移動しますが、 UIPickerView. 基本的UIPickerViewには表示されていますが、キーボードの後ろにあります。現在のUITextField編集終了イベントと必須テキスト フィールドの編集開始を辞退します。前のUITextField. 誰かが私が間違っていることを教えてもらえますか?

次のシーケンスが機能します。

  1. 通常UITextFieldを選択してテキストを挿入し、完了ボタンを押します(これによりキーボードが非表示になります)
  2. ピッカーを選択UITextField(ピッカー ビューが表示されます)

..しかし、以下はしません:

  1. 法線UITextFieldを選択してテキストを挿入
  2. ピッカーを選択UITextFieldします (前の [完了] ボタンを押さなかったので、ピッカー ビューはキーボードの後ろにありますUITextField)。ここでは終了編集を呼び出しますが、キーボードは非表示になりません!

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];
        scrollView.contentSize = CGSizeMake(320, 750);
        [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
        return YES;
     }
    
    -(void)textFieldDidEndEditing:(UITextField *)textField  
    {
        [textField resignFirstResponder];
    }
    
    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        DatePicker.hidden = YES;
        CountryPickerView.hidden = YES;
    
        switch (textField.tag) {
            case 3:
                [textField resignFirstResponder];
                DatePicker.hidden = NO;
                return;
            case 6:
                [textField resignFirstResponder];
                CountryPickerView.hidden = NO;
                return;
            default:
                break;
        }
        scrollView.contentSize = CGSizeMake(320, 650);
        [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
    }
    
4

7 に答える 7

10

タグではなく、オブジェクトへのポインターに依存して[textField resignFirstResponder];、textFieldDidEndEditing から削除する必要があります。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == theTextFieldIDontWantKeyboardFor) {  
        [thepreviousTextField resignFirstResponder]; 
        return NO;
    }
    return YES; 
}
于 2012-02-28T16:49:33.330 に答える
7

キーボードは非表示になりますが、完了ボタンを押さずに、キーボードではなくPickerViewが必要な別のuitextfieldに移動した場合は非表示になります。

これを処理する正しい方法inputViewは、キーボードの代わりにピッカーを使用するフィールドのプロパティを設定することです。必要に応じてピッカーを構成し(デリゲート、データソースなどを設定)、フィールドのとして設定しますinputView。システムは、あるフィールドから次のフィールドに移動するときに、キーボードの非表示とピッカービューの表示、またはその逆を処理します。

于 2012-02-28T20:21:24.733 に答える
3

辞任せずにあるテキストフィールドから次のテキストフィールドにコントロールを切り替えるtextFieldDidBeginEditingと、呼び出されないため、テキストフィールドを「firstResponder」にして辞任する必要があります (アクティブなテキストフィールドの変更により firstResponder ではないため)。resignFirstResponder

于 2012-02-28T16:54:58.447 に答える
3
[yourTextField resignFirstResponder];

実際にはキーボードを隠しているので、ピッカーが開かれようとしているときにそれを使用してください。

于 2012-02-28T16:50:09.677 に答える
1

このコードを試してください

 -(void)textFieldDidEndEditing:(UITextField *)textField  
  {
  if(textField==nameTextField){
    [nameTextField resignFirstResponder];

     //
  }
  else if(textField==pickerTextField){

  ///
  }
  }

  - (BOOL)textFieldShouldReturn:(UITextField *)textField {
  if(textField==nameTextField){
    [nameTextField resignFirstResponder];

    //
  }
  else if(textField==pickerTextField){

  ///
  }
  }
于 2012-02-28T17:00:19.273 に答える
0

ここに私の最終結果を追加します!

Valexaによるソリューション。これは完全にうまく機能しましたが、さまざまな入力ビューを手動で処理する必要がありました。

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];
            scrollView.contentSize = CGSizeMake(320, 750);
            [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
        return YES;
    }

    - (void)textFieldDidBeginEditing:(UITextField *)textField {    
           previousTextField = textField;
           scrollView.contentSize = CGSizeMake(320, 650);
           [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
    }

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
           if (textField == CountryTextField || textField == BirthdayTextField) {
                  [previousTextField resignFirstResponder]; 
                  return NO; 
           }
          return YES; 
    }

すばらしい解決策(ありがとうCaleb):前のテキストフィールドの余分な変数を監視する必要はなく、必要なビューを表示および追加するという頭痛の種も必要ありません

BirthdayTextField.inputView = DatePickerView;
CountryTextField.inputView = CountryPickerView;
SexTextField.inputView = SexPickerView;

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
    scrollView.contentSize = CGSizeMake(320, 750);
    [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    scrollView.contentSize = CGSizeMake(320, 650);
    [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
}
于 2012-02-28T21:38:15.163 に答える