空のUITextFieldでバックスペースを検出する


126

空のiPhoneキーボードでBackspace/ Deleteキーが押されたことを検出する方法はありUITextFieldますか?が空のBackspace場合にのみ、いつが押されたかを知りたいUITextField


コメントでの@Alex Reynoldsの提案に基づいて、テキストフィールドの作成中に次のコードを追加しました。

[[NSNotificationCenter defaultCenter] addObserver:self
          selector:@selector(handleTextFieldChanged:)
              name:UITextFieldTextDidChangeNotification
            object:searchTextField];

この通知は受信されます(handleTextFieldChanged関数が呼び出されます)がBackspace、空のフィールドでキーを押しても通知されません。何か案は?


この質問の周りにいくつかの混乱があるようです。Backspaceキーが押されたときに通知を受け取りたい。それでおしまい。ただし、ソリューションUITextFieldがすでに空の場合にも機能する必要があります。


「キーボードが空の場合のみ」ではなく、「UITextFieldが空の場合のみ」という意味かもしれません...?
スティーブハリソン

@Steve Harrison:ありがとう。更新しました。
marcc 2009

私は同じようなことをやろうとしていますが、あなたはどのような解決策を得ましたか?私がやっていることは、スクロールビューのテキストフィールドです。テキストを入力すると、候補が表示され、クリックすると、テキストフィールドの左側にラベルオブジェクトが配置されます。事前に感謝します:D
生地

2011/11ソリューション空のUITextFieldのためのランタイム策略を使用して:bjhomer.blogspot.com/2011/11/...
Jano

4
ものすごく些細なことを途方もなく長くしています。これは難しいことではありません。
アダムウェイト2013年

回答:


36

これはロングショットかもしれませんが、うまくいくかもしれません。テキストフィールドのテキストをゼロ幅の空白文字に設定してみてください\u200B。空のテキストフィールドでバックスペースを押すと、実際にスペースが削除されます。その後、スペースを再挿入するだけです。

ユーザーがキャレットをスペースの左側に移動した場合、機能しない可能性があります。


3
@Andrew、これが私が採用することにしたアプローチです。少しコードがかかりましたが、確かに効果的です。私が何か間違ったことをしていると言わずに助けてくれてありがとう。
marccは2010年

2
このテクニックはiPhone> 3.1.3で機能するかもしれませんが、ハックで将来のバージョンでは機能しなくなる可能性があります。
ma11hew28

6
ユーザーがカーソルをスペースの左側に移動した場合、削除が検出されないことを確認できます。それを修正する方法を理解できる場合は、テキストが文字列と等しいときにサブクラスUITextFieldを作成しcanPerformAction:withSender:return NOfor select:およびselectAll:action を実装する必要もあります@"\u200B"
ma11hew28

2
問題は、これが安全なテストフィールドに対して機能しないことです。それを処理する方法についてのアイデアはありますか?
カイルクレッグ2013

7
申し訳ありませんが、このアイデアは悪いです。それは信じられないほどハックであり、30程度の賛成投票では受け入れられるべき答えではありません。代わりに、他のコメンターが述べたように、UITextFieldをサブクラス化します。
ブライアンサシェッタ

155

スウィフト4:


サブクラスUITextField

// MyTextField.swift
import UIKit

protocol MyTextFieldDelegate: AnyObject {
    func textFieldDidDelete()
}

class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        super.deleteBackward()
        myDelegate?.textFieldDidDelete()
    }

}

実装:

// ViewController.swift

import UIKit

class ViewController: UIViewController, MyTextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialize textField
        let input = MyTextField(frame: CGRect(x: 50, y: 50, width: 150, height: 40))

        // set viewController as "myDelegate"
        input.myDelegate = self

        // add textField to view
        view.addSubview(input)

        // focus the text field
        input.becomeFirstResponder()
    }

    func textFieldDidDelete() {
        print("delete")
    }

}

Objective-C:


サブクラスUITextField

//Header
//MyTextField.h

//create delegate protocol
@protocol MyTextFieldDelegate <NSObject>
@optional
- (void)textFieldDidDelete;
@end

@interface MyTextField : UITextField<UIKeyInput>

//create "myDelegate"
@property (nonatomic, assign) id<MyTextFieldDelegate> myDelegate;
@end

//Implementation
#import "MyTextField.h"

@implementation MyTextField

- (void)deleteBackward {
    [super deleteBackward];

    if ([_myDelegate respondsToSelector:@selector(textFieldDidDelete)]){
        [_myDelegate textFieldDidDelete];
    }
}

@end

今すぐ簡単に追加MyTextFieldDelegateをあなたにUIViewControllerして、設定UITextFields myDelegateをしますself

//View Controller Header
#import "MyTextField.h"

//add "MyTextFieldDelegate" to you view controller
@interface ViewController : UIViewController <MyTextFieldDelegate>
@end

//View Controller Implementation
- (void)viewDidLoad {
    //initialize your text field
    MyTextField *input = 
     [[MyTextField alloc] initWithFrame:CGRectMake(0, 0, 70, 30)];

    //set your view controller as "myDelegate"
    input.myDelegate = self;

    //add your text field to the view
    [self.view addSubview:input];
}

//MyTextField Delegate
- (void)textFieldDidDelete {
    NSLog(@"delete");
}

9
これが最良の解決策です。受け入れられた答えはハックです。Objective Cはサブクラス化に基づいており、このソリューションはそれを適切に使用して問題を解決します。
TJ 2013年

で、私の既存のデリゲートメソッドに何が起こるのだろうViewController 、私はのサブクラスに私のテキストフィールドのデリゲートを設定した場合、クラスUITextFieldの代わりにUIViewController
ロハン・パテル

4
Appleのバグのように見えるため、これは現在ios8では動作しないようです。devforums.apple.com
message

1
私の答えのようにios8バグの回避策ソリューションを使用しましたが、うまくいきました。解決策を探している人に役立つかもしれません。
furkan3ayraktar 2014年

1
deleteBackward()あなたの場合に呼び出されることはありませんreturn falsetextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
igrrik

41

更新:をオーバーライドする例については、JacobCaraballoの回答を参照してください-[UITextField deleteBackward]

チェックアウトUITextInputは、具体的にUIKeyInput持っているdeleteBackwardデリゲートメソッドをすることを常に削除キーが押されたときに呼び出されます。SimpleTextInputとこのiPhone UIKeyInputの例で行われUILabelているように、単純なことをしている場合は、サブクラス化してUIKeyInputプロトコルに準拠させることを検討してください。注:およびその関連(を含む)は、iOS 3.2以降でのみ使用できます。UITextInputUIKeyInput


2
これが正解です。UITextFieldのクイックサブクラスを使用するので、ハックがなく非常にシンプルです。
2013

下にジェイコブの答えを見つけました。これの詳細な例を示します。
2013

この回答はiOS 5では機能しないことに注意してください。テキストフィールドが空の場合、バックスペースを押してもこのメソッドは呼び出されません。
jfeldman 2013

31

次のようなコード:

@interface MyTextField : UITextField
@end

@implementation MyTextField

- (void)deleteBackward
{
    [super deleteBackward];

    //At here, you can handle backspace key pressed event even the text field is empty
}

@end

最後に、テキストフィールドのカスタムクラスプロパティを「MyTextField」に変更することを忘れないでください。


5
これは受け入れられる答えになるはずです。クリーンで、実際に質問に答えます。
Ryan Romanchuk 2013

1
それは質問に答えます... iOS 6.0+をターゲットにしている限り。iOS 5では、残念ながら、deleteBackwardがサブクラスで呼び出されることはありませんでした。
BJホーマー2013年

2
BJ Homer氏、デバイスの93%がiOS 6を搭載しているため、iOS 5をターゲットにしないことは、通常、それほど大きな問題ではありません。
ジョナサン。

2
これを見つけるのに十分なほど下にスクロールし続けてよかった。IOS 7で今日これを行うには100%正しい方法
MusiGenesis

この質問に対する他の回答は非常に多く、これは単なる回避策であり、空のフィールドでBackspaceキーが押されている状況にはほとんど対応していません。ただし、これは完璧であり、本当にクリーンな方法です。
クリストファーハンナ

19

迅速な実装:

import UIKit

protocol PinTexFieldDelegate : UITextFieldDelegate {
    func didPressBackspace(textField : PinTextField)
}

class PinTextField: UITextField {

    override func deleteBackward() {
        super.deleteBackward()

        // If conforming to our extension protocol
        if let pinDelegate = self.delegate as? PinTexFieldDelegate {
            pinDelegate.didPressBackspace(self)
        }
    }
}

おかげで、この方法がアップルによって推奨されていることを知っているかもしれません。テキストフィールドについては文書化されていないようです。
kalpesh jetani

textViewで私のために働いた。共有してくれてありがとう;)
Edouard Barbier 2017

テキストフィールドが空でバックスペースがクリックされたときに私のために働いた。
Ramakrishna 2017年

17

私はsubclass解決策よりも簡単な方法を創設しました。少し奇妙ですが、問題なく動作します。

- (BOOL)textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
        replacementText:(NSString *)text
{
    const char * _char = [text cStringUsingEncoding:NSUTF8StringEncoding];
    int isBackSpace = strcmp(_char, "\b");

    if (isBackSpace == -8) {
       // is backspace
    }

    return YES;
}

比較の結果が-8であるので、少し奇妙です。多分私はいくつかの点で間違っているでしょうC Programming。しかし、その正しい仕事;)


1
背泳ぎが「\ b」に設定されていません。しかし、注意深くデバッグすると、「\ 0」が表示されます。したがって、strcmpメソッドでは2つの値が等しいという結果0が得られます。const char * stoke = [text cStringUsingEncoding:NSASCIIStringEncoding]; const char * backstroke = "\ 0"; //これは\ b-> "\ x08"と同じです; strcmp(バックストローク、ストーク);
ユン・リー

また、strcmp(s1、s2)の定義により、s1 == s2、> 0の場合、0を返します。
ユン・リー

これがどのように機能するか理解できませんか?@YoonLee:strcmpリターンも返さないと言っているのではないですか-1, 0, or 1?それが私の理解でした。
chug2k 2014

1
textviewでは、テキストがない場合でも常にバックスペースを検出します。UITextFieldは異なります
LolaRun

2
これはUITextViewDelegateメソッドであり、ではありませんUITextFieldDelegate
pkamb

11

お試しください delegate

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string {

次にrange.length == 1backspaceがヒットした場合にそうであると思われるものを確認します。


8
ただし、フィールドが空でない場合にのみ呼び出されます。元の質問に注意してください。:)
Eric Goldberg

これにはUITextViewを使用します。
Oleg

11

テキストフィールドが空の場合でも、キーボードの削除キーを検出するのに役立つコードを使用してください。

目的C:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }

スウィフト:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { return true }

Tx-ちょうど私が必要としたもの。しかし、それはどこに文書化されていますか?
Andy Weinstein

9

Niklas Alvaeusの回答は、同様の問題で私を助けました

入力を特定の文字セットに制限していましたが、バックスペースは無視されていました。だからrange.length == 1トリミングする前にチェックしてもらいましたNSString。trueの場合、文字列を返すだけで、トリミングしません。下記参照

 - (BOOL) textField:(UITextField *)textField 
          shouldChangeCharactersInRange:(NSRange)range 
          replacementString:(NSString *)string
 {
     NSCharacterSet *nonNumberSet = 
      [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] 
         invertedSet];

    if (range.length == 1) {
       return string;
    }
    else {
       return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
    }   
 }

このメソッドは、戻り値として文字列ではなくブール値を期待します
Pascalius '13

4

ジェイコブの答えに問題がある人のために、私は次のように私のテキストフィールドサブクラスを実装しました、そしてそれはうまくいきます!

#import <UIKit/UIKit.h>

@class HTTextField;

@protocol HTBackspaceDelegate <NSObject>

@optional
- (void)textFieldDidBackspace:(HTTextField*)textField;
@end

@interface HTTextField : UITextField<UIKeyInput>

@property (nonatomic, assign) id<HTBackspaceDelegate> backspaceDelegate;

@end


#import "HTTextField.h"

@implementation HTTextField

- (void)deleteBackward {
    [super deleteBackward];
    if ([self.backspaceDelegate respondsToSelector:@selector(textFieldDidBackspace:)]){
        [self.backspaceDelegate textFieldDidBackspace:self];
    }
}

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
    BOOL shouldDelete = YES;

    if ([UITextField instancesRespondToSelector:_cmd]) {
        BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, UITextField *))[UITextField instanceMethodForSelector:_cmd];

        if (keyboardInputShouldDelete) {
            shouldDelete = keyboardInputShouldDelete(self, _cmd, textField);
        }
    }

    if (![textField.text length] && [[[UIDevice currentDevice] systemVersion] intValue] >= 8) {
        [self deleteBackward];
    }

    return shouldDelete;
}

@end

あなたは迅速にコードを書くことができますか?「protoco uikeyinputへの冗長な確認」というエラーが発生しました
Raj Aggrawal

4

うん、textFieldが空のときにバックスペースを検出するには、以下のメソッドを使用します。

UITextFieldDelegateを追加する必要があります

yourTextField.delegate = self (必須)

迅速:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { 
    return true
}

目的C:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { 
    return YES; 
}

5
これは私を必要としません。他のすべてのデリゲートメソッドは、イベントが発生したときに呼び出されます。
Hemang

仲間に感謝..あなたはそれを釘付けにした。:)
MS。

@ McDonal_11 textfield.delegate = self of textfieldを設定するのを忘れたようです。
Himanshu padia

設定しました。他のUITextFieldのデリゲートメソッドは正常に動作しています。これだけでは機能しません。何が恋しいの??
McDonal_11

3

バックスペースを検出するために私が見つけた最良の用途は、ユーザーが空のバックスペースを押したときの検出UITextFieldです。たとえば、メールアプリに「バブル」受信者がいる場合UITextField、でバックスペースを押すと、最後の「バブル」受信者が選択されます。

これは、Jacob Caraballoの回答と同様の方法で行うことができます。しかし、ジェイコブの答えでは、UITextFieldバックスペースを押したときにに1文字残っている場合、デリゲートメッセージを受信するまでにUITextFieldは既に空になっているためbackspace、最大1文字のテキストフィールドで効果的に検出されます。

実際、正確にゼロ文字(空)のを検出backspaceしたいUITextField場合は、へdelegateの呼び出しの前ににメッセージを送信する必要がありますsuper deleteBackward。例えば:

#import "MyTextField.h"

//Text field that detects when backspace is hit with empty text
@implementation MyTextField

#pragma mark - UIKeyInput protocol
-(void)deleteBackward
{
  BOOL isTextFieldEmpty = (self.text.length == 0);
  if (isTextFieldEmpty) {
    if ([self.delegate 
         respondsToSelector:@selector(textFieldDidHitBackspaceWithEmptyText:)]) {

        [self.delegate textFieldDidHitBackspaceWithEmptyText:self];
        }
    }
    [super deleteBackward];
}
@end

このようなテキストフィールドのインターフェースは次のようになります。

@protocol MyTextFieldDelegate;

@interface MyTextField : UITextField
@property(nonatomic, weak) id<MyTextFieldDelegate> delegate;
@end

@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
-(void)textFieldDidHitBackspaceWithEmptyText:(MyTextField *)textField;
@end

2
これをiOS8で機能させるには(このデリゲートメソッドが呼び出されない原因となるバグがある場合)、次の回答を参照してください:stackoverflow.com/a/25862878/893101。ios8バグの詳細:devforums.apple.com/message/1009150#1009150
pIkEL

2

iOS 6では、フィールドが空の場合も含め、バックスペースが押されたときに、UITextFieldでdeleteBackwardメソッドが呼び出されます。したがって、UITextFieldをサブクラス化して、独自のdeleteBackward実装を提供できます(スーパーも呼び出す)。

私はまだiOS 5をサポートしているので、Andrewの回答とこれの組み合わせが必要になります。


1

:)タイトル「バックスペースの検出」のためだけに使用しますUIKeyboardTypeNumberPad

私も今夜同じ質問に会います、そしてそれを見つけるための私のコードは次のとおりです:

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string
{
    NSLog([NSString stringWithFormat:@"%d", [string length]]);
}

UIKeyboardTypeNumberPad使用すると、ユーザーは数値またはバックスペースしか入力できないため、stringの長さが0の場合は、バックスペースキーである必要があります。

上記がいくつかの助けになることを願っています。


これは、どのキーボードタイプでも同じです。
ma11hew28 14

このメソッドをテキストフィールドに接続するにはどうすればよいですか?
user230910 2017

1

テキストフィールドに何が表示されるかを事前に作成したり、shouldChangeCharactersInRangeメソッドに入力されている特殊文字を特定したりするのではなく、次のことを実行することをお勧めします。

[self performSelector:@selector(manageSearchResultsDisplay) 
           withObject:nil 
           afterDelay:0];

これにより、現在の操作が完了した直後にメソッドを呼び出すことができます。これのクールな点は、完了するまでに、変更された値がすでににあることUITextFieldです。その時点で、長さを確認したり、そこにあるものに基づいて検証したりできます。


1

iOS 8.3では、UITextFieldのサブクラス化が機能しませんでした。deleteBackwardが呼び出されることはありませんでした。

これが私が使用したソリューションで、すべてのiOS 8バージョンで動作し、他のiOSバージョンでも動作するはずです

for textField in textFields {
            textField.text = " "
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if string == "" && textField.text == " "   {
            // Do stuff here
            return false
        }
        return true
}

1

.hファイルにUIKeyInputデリゲートを追加します

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {

if ([textField isEqual:_txtFirstDigit]) {

}else if([textField isEqual:_txtSecondDigit]) {
    [_txtFirstDigit becomeFirstResponder];

}else if([textField isEqual:_txtThirdDigit]) {
    [_txtSecondDigit becomeFirstResponder];

}else if([textField isEqual:_txtFourthDigit]) {
    [_txtThirdDigit becomeFirstResponder];
}
return YES;
}   

改善されたフォーマット


1

ユーザーがバックスペースをタップしているときにテキストフィールドに値がある場合に通知するマイナーな改善を含む同様のソリューションを実装しました。これは、バックスペースが押されたときにテキストフィールドが空の場合に別のテキストフィールドにのみ焦点を当てる必要がある場合に便利です。

protocol MyTextFieldDelegate : UITextFieldDelegate {
    func textFieldDidDelete(textField: MyTextField, hasValue: Bool)
}

override func deleteBackward() {
    let currentText = self.text ?? ""
    super.deleteBackward()
    let hasValue = currentText.isEmpty ? false : true
    if let delegate = self.delegate as? MyTextFieldDelegate {
        delegate.textFieldDidDelete(textField: self, hasValue: hasValue)
    }
}

1

最もポプラの答えに欠けているのは、テキストフィールドが空かどうかを検出する機能です。

つまり、TextFieldサブクラスのdeleteBackwards()メソッドをオーバーライドしても、テキストフィールドがすでに空であるかどうかはまだわかりません。(deleteBackwards()の前と後の両方、textField.text!空の文字列です。""

これが私の改善です。削除する前に空かどうかをチェックします。

1. UITextFieldDelegateを拡張するデリゲートプロトコルを作成する

protocol MyTextFieldDelegate: UITextFieldDelegate {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool)
}

2.サブクラスのUITextField

class MyTextField: UITextField {
    override func deleteBackward() {
        // see if text was empty
        let wasEmpty = text == nil || text! == ""

        // then perform normal behavior
        super.deleteBackward()

        // now, notify delegate (if existent)
        (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
    }
}

3.新しいデリゲートプロトコルを実装する

extension MyViewController: MyTextFieldDelegate {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
        if wasEmpty {
            // do what you want here...
        }
    }
}

1

Swift 5.1の 1桁の数字を持つテキストフィールドの包括的なハンドラー:

  • textFieldsのアウトレットコレクションがあると仮定します(デリゲートも接続されています)

1ステップ

protocol MyTextFieldDelegate: class {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) 
}

final class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        let wasEmpty = text == nil || text == ""

        // then perform normal behavior
        super.deleteBackward()

        // now, notify delegate (if existent)
        (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
    }
}

2ステップ

final class ViewController: UIViewController {

    @IBOutlet private var textFields: [MyTextField]!

    override func viewDidLoad() {
        super.viewDidLoad()
        textFields.forEach {
            $0.delegate = self
            $0.myDelegate = self
        }
    }
}

3ステップ

extension ViewController: UITextFieldDelegate, MyTextFieldDelegate {
    func textFieldHasChanged(with text: String, _ tag: Int, for textField: UITextField) {
        textField.text = text

        if let someTextField = (textFields.filter { $0.tag == tag }).first {
            someTextField.becomeFirstResponder()
        } else {
            view.endEditing(true)
        }
    }

    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
        // If the user was pressing backward and the value was empty, go to previous textField
        textFieldHasChanged(with: "", textField.tag - 1, for: textField)
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // Restrict to only digits
        let aSet = NSCharacterSet(charactersIn: "0123456789").inverted
        let compSepByCharInSet = string.components(separatedBy: aSet)
        let numberFiltered = compSepByCharInSet.joined(separator: "")

        guard string == numberFiltered, let text = textField.text else { return false }

        if text.count >= 1 && string.isEmpty {
            // If the user is deleting the value
            textFieldHasChanged(with: "", textField.tag - 1, for: textField)
        } else {
            textFieldHasChanged(with: string, textField.tag + 1, for: textField)
        }

        return false
    }
}

0

@andrewのアイデアに基づく私の解決策:

どこか、たとえばviewDidLoad

        textField.delegate = self
        textField.addTarget(self, action: #selector(valueChanged(_:)), for: .editingDidBegin)

その後

    @objc func valueChanged(_ textField: UITextField) {
        textField.text = "\u{200B}"
    }

    override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        textField.text = string
        if string == "" {
            //backpaspace pressed 
        }

0

テキストビュー/フィールドのテキストをチェックして空であるかどうかを確認し、shouldChangeTextInデリゲートメソッドで置換テキストも空であることを確認できます。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if (textView.text == "" && text == "") {
        print("Backspace on empty text field.")
    }
    return true
}

-2

このようなもの:

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string       
{  
    if (![text hash] && ![textField.text length])  
        [self backspaceInEmptyTextField];  
}

もちろん、ハッシュは1つの文字列に対するものです。


-2

TextField Delegateメソッドを使用する:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

上記のメソッドに次のコードを追加して、削除イベントを検出します

if(textField == YourTextField)
{
    if ([string length] == 0 && range.length > 0)
    {
        // Your Code after deletion of character
    }
}


-3
+ (BOOL)detectBackspaceOnly:(NSString *)string
{
    for(int i=0 ; i<string.length ; i++){
        unichar caract = [string characterAtIndex:i];
        if(caract != ' ' && caract != '\n')
            return NO;
    }

    return YES;
}

2
多分これをどこに置くべきかについての少しの説明?
Alex Cio 2014

-4

UITextViewDelegate

- (BOOL)               textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
                replacementText:(NSString *)text
{
    if(text isEqualToString:@"");
    {
        NSLog(@"press backspace.");
    }
}

私にとっては問題ありません。

中国語の簡体字ピンインと中国語の手書き入力の更新:

- (BOOL)               textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
                replacementText:(NSString *)text
{
    if (range.length > 0 && [text isEqualToString:@""]) {
        NSLog(@"press Backspace.");
    }
    return YES;
}

ドキュメントのベースは言う:

「ユーザーがを押すdeleteKeyと、範囲の長さは1になり、空の文字列オブジェクトがその1文字を置き換えます。」


1
この質問はについてUITextFieldではなくについてUITextViewです。
ma11hew28 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.