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;
}