web-dev-qa-db-ja.com

UITextViewの「完了」ボタンをresignFirstResponderにする方法は?

ユーザーが[完了]をタップしたときに、編集可能なUITextViewキーボード(resignFirstResponder)を辞任しようとしています。 UITextFieldを使用して、次のコードでこれを行うことができました。

- (IBAction)doneEditing:(id)sender {
    [sender resignFirstResponder];
}

...次に、それをInterface Builderの関連するUITextFieldのアクション「Did End on Exit」にアタッチします。

ただし、UITextViewを使用すると、「終了時に終了」アクションにアクセスできないようです。これを実現する方法について何か提案はありますか?

23
Jason

新しい回答

ビューには、以下のIBActionに接続されたUIBarButton( "Done")があります。

- (IBAction)doneEditing:(id)sender {
    [textView resignFirstResponder];
}

ここで、textViewは、.hファイルで定義され、ストーリーボードまたは.xibファイルで接続されたtextViewアウトレットです。このような:

@property (retain, nonatomic) IBOutlet UITextView *textView;

古い回答

以下を確認してください。

  1. UITextViewDelegateが.hで指定されているか
  2. Uitextviewのデリゲートメソッドを実装します。textViewShouldEndEditing、YESを返します
  3. .m(コントローラー)がIBのuitextviewのデリゲートであることを確認してください
  4. resignFirstResponderが機能するようになりました。
13
Jordan

受け入れられた答えは私にとってはうまくいきませんでした。代わりに、次のデリゲートメソッドを次のように呼び出す必要があります。

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]){
        [textView resignFirstResponder];
        return NO;
    }else{
        return YES;
    }
}

これをUITextViewデリゲートとして割り当てるクラスに貼り付ければ、機能します。

88
Rich Lowenberg

Swift 4では、UITextViewDelegateを実装して「\ n」を待つことができます。

    myTextView.delegate = self

// ...

extension MyViewController : UITextViewDelegate {

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
            return false
        }

        return true
    }
}
0
Axel Guilmin