4

私は困惑しており、誰かが助けてくれることを願っています。

セグエの前に、5 つのテキスト フィールドすべてに対して Resign ファーストレスポンダー メソッドを呼び出しています。セグエが発生します。セグエの前にキーボードが表示されていた場合、何をしてもキーボードは残ります。これは、IOS6 では発生しませんでした。IOS7 でのみ発生しています。

どうぞよろしくお願いいたします。

シナリオは次のとおりです。

ユーザーは一度に 1 つのテキスト フィールドに触れてデータを入力します。キーボードは、あるフィールドから次のフィールドへのファーストレスポンダーの変更に問題はなく、問題なく DONE ボタンから辞任することができます。問題は、ユーザーがピッカー ビューから入力されるフィールドに触れたときに発生します。以前のテキスト フィールドのいずれかからキーボードが表示されていた場合、それは消えません。

このコードは、2 つのフィールドresignFirstRespondereditingDidBeginアクションを実行しようとしています。これらの 2 つのフィールドを使用して数値を保持していますが、次のビューでピッカーから入力しています。

- (IBAction)txtRatioOrHullTypeTouched:(id)sender 
{    
    // Hide the keyboard before the segue to the picker occurs.
    [self.txtPitch resignFirstResponder];
    [self.txtRPM resignFirstResponder];
    [self.txtSlipOrSpeed resignFirstResponder];
    [self.txtRatio resignFirstResponder];
    [self.txtHullType resignFirstResponder];

    segueToPicker = YES; // Raise flag indicating that this segue is to the picker.
    [self performSegueWithIdentifier:@"toPicker" sender:sender];
}

viewWillDisappearここに示すように、これと同じコードも入れます。

- (void)viewWillDisappear:(BOOL)animated // Unchanged
{
    // Hide the keyboard before the segue to the picker occurs.
    [self.txtPitch resignFirstResponder];
    [self.txtRPM resignFirstResponder];
    [self.txtSlipOrSpeed resignFirstResponder];
    [self.txtRatio resignFirstResponder];
    [self.txtHullType resignFirstResponder];

    [super viewWillDisappear:animated];
}

これらのメソッドは両方とも、初期ビューの ViewController.m ファイルにあります。

4

8 に答える 8

2

上記のすべてを試しましたが、コントローラーをボタンで閉じている限り機能しました。ボタンを押したときに呼び出された関数は、TextField の rejectFirstResponder() 関数を呼び出すことができ、すべて問題ありませんでした。

ただし、エッジスワイプを実行してコントローラーを閉じると、次にキーボードを表示したときにキーボードがポップアップし続けました. 私のコードでは、ビュー間で同じコントローラーを再利用しています。これは賢明ではないかもしれませんが、きびきびしています!

これについてインターネットが書いたすべてを試した後(実際にはそうではありませんが、かなり近い)、TextFieldのtextViewShouldBeginEditing()を実装し、ViewControllers ViewDidDisappearとViewDidAppearの間でfalseを返すことができることがわかりました。ハックですが、他に何も機能しないときにうまくいきました。

これが皆さんのお役に立てば幸いです!

スウィフトコード:

私のViewControllerで

override func viewDidAppear(animated: Bool) {
  super.viewDidAppear(animated)
  myTextField.allowEdit = true
}

override func viewDidDisappear(animated: Bool) {
  super.viewDidDisappear(animated)
  myTextField.allowEdit = false
}

私の TextField クラスで

class MyTextField: UIView, UITextFieldDelegate {
  var allowEdit = true

  func textFieldShouldBeginEditing(textView: UITextView) -> Bool {
    return allowEdit
  }
}
于 2015-11-24T19:37:43.467 に答える
2

ここで、問題の原因となっているテキストフィールドを削除し、ボタンに置​​き換えました。私が試した (数十の) シナリオでは、IOS6 ではすべて問題なく動作していましたが、IOS7 でこのコードが期待どおりに動作することはありませんでした。

于 2013-10-29T21:09:57.140 に答える
0

そのため、キーボードを制御するテキスト フィールドで辞任が許可されないようになりました。そのフィールドで canResignFirstResponder クエリを使用したところ、結果 (ブール値) は FALSE でした。また、resignFirstResponder が呼び出された後でも、フィールド内でカーソルが点滅していることに気付きました。— ラリー J 25 10 月 252013 〜で 23:32 に

これは古いことは知っていますが、同様の問題があり、他の人に役立つ場合に備えて、何がうまくいったかを共有したかったのです。

上記のコメントを読んだ後、textFieldDidBeginEditing の場所から textFieldSHOULDBeginEditing に移動するうまく[self.view endEditing:YES]いったことがわかりました。これで、セグエの前にキーボードが適切に閉じられます。

于 2015-03-06T23:30:32.963 に答える
0

Zaheer のコメントを Swift に取り入れると、これは私にとって非常にうまく機能します。

 view.endEditing(true)
于 2018-12-02T17:59:55.210 に答える