16

iOS 6 では、セキュリティで保護されたテキスト フィールドにテキストを入力し、別のテキスト フィールドに変更してから、セキュリティで保護されたテキスト フィールドに戻ってバックスペースを押すと、すべての文字が削除されます。私はこれで問題ありませんが、この安全なテキスト フィールドに文字が含まれているかどうかに基づいて、ボタンを有効/無効にしようとしています。フィールドにどの文字があるか、およびバックスペースが押されたかどうかを判断する方法は知っていますが、すべての文字が消去されているかどうかを検出する方法を判断するのに苦労しています。

これは、フィールドの新しいテキストを取得するために使用しているデリゲート メソッドですが、バックスペースがすべての文字をクリアするヒット。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    //returns the "new text" of the field
    NSString * text = [textField.text stringByReplacingCharactersInRange:range withString:string];
}

どんな助けでも大歓迎です。

ありがとう!

4

7 に答える 7

3

テキストを削除しているか入力しているかに関係なく、iOS6 以降で編集を開始すると、安全なテキスト フィールドがクリアされます。テキスト フィールドがバックスペースからクリアされた場合、置換文字列の長さが 0 であるかどうかのチェックは機能しますが、厄介なことにtextField:shouldChangeCharactersInRange:replacementString:、テキストを入力するときにテキストがクリアされると、範囲と置換文字列のパラメータが正しくありません。これが私の解決策でした:

1)textFieldTextDidChange通知に登録します。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldTextDidChange:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:nil];

textField:shouldChangeCharactersInRange:replacementString:2)テキスト フィールドが安全で、クリアされている可能性がある場合は、デリゲート メソッドを再度呼び出します。

- (void)textFieldTextDidChange:(NSNotification *)notification
{
    if (textField.secureTextEntry && textField.text.length <= 1) {
        [self.textField.delegate textField:self.textField
             shouldChangeCharactersInRange:NSMakeRange(0, textField.text.length)
                         replacementString:textField.text];
    }
}
于 2013-10-20T17:13:53.080 に答える
0

OPとして正確な問題があり、選択した回答に詳述されているカーソル位置の変更を行う必要がないことがわかったため、代替ソリューションを投稿しました。

以下は UITextFieldDelegate メソッドです。有効にしたいボタンがこのクラスの外部にあるため、カスタム デリゲート メソッド didChangeValueForTextField を呼び出します。

UITextFieldDelegate を実装するクラス

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newValue = [textField.text stringByReplacingCharactersInRange:range withString:string];
BOOL shouldReturn = YES;

if (range.location > 0 && range.length == 1 && string.length == 0){
    [textField deleteBackward];

    if ([textField.text isEmptyCheck]) {  // Check if textField is empty
        newValue = @"";
    }

    shouldReturn = NO;
}

if(self.delegate && [self.delegate respondsToSelector:@selector(didChangeValueForField:withNewValue:)]) {
    [self.delegate didChangeValueForField:textField withNewValue:newValue];
}

return shouldReturn;

}

キーは、セキュア フィールドの単一文字削除と、フィールド クリアをトリガーするセキュア フィールドの単一文字削除の違いを検出することでした。上記のデリゲート メソッド内でこれを検出する必要がありました。

有効にするボタンを含むクラス

 - (void)didChangeValueForField:(UITextField *)textField withNewValue:(NSString *)value {
  // Update values used to validate/invalidate the button.
  // I updated a separate model here.

  // Enable button based on validity
  BOOL isEnabled = [self allFieldsValid];  //  Check all field values that contribute to the button being enabled.

  self.myButton.enabled = isEnabled;

}
于 2016-02-21T22:33:19.997 に答える