UITextField с защищенным входом, всегда очищается перед редактированием - PullRequest
33 голосов
/ 05 сентября 2011

У меня странная проблема, из-за которой мой UITextField, который содержит защищенную запись, всегда очищается, когда я пытаюсь ее отредактировать. Я добавил 3 символа в поле, перешел в другое поле и вернулся, курсор находится в позиции 4-го символа, но когда я пытаюсь добавить другой символ, весь текст в поле очищается новым символом. У меня «Очистить, когда редактирование начинается» снят в перо. Так в чем же проблема? Если я удаляю свойство защищенной записи, все работает нормально, так это свойство текстовых полей защищенной записи? Есть ли способ предотвратить такое поведение?

Ответы [ 23 ]

0 голосов
/ 03 февраля 2017

Я экспериментировал с ответами dwsolberg и fluidsonic, и это, похоже, работает

override func becomeFirstResponder() -> Bool {

    guard !isFirstResponder else { return true }
    guard super.becomeFirstResponder() else { return false }
    guard self.isSecureTextEntry == true else { return true }
    guard let existingText = self.text else { return true }
    self.deleteBackward() // triggers a delete of all text, does NOT call delegates
    self.insertText(existingText) // does NOT call delegates

    return true
}
0 голосов
/ 07 февраля 2014

Мое решение (до тех пор, пока ошибка не будет исправлена, я полагаю) заключается в создании подкласса UITextField таким образом, чтобы он добавлялся к существующему тексту, а не очищался, как раньше (или как в iOS 6). Попытки сохранить исходное поведение, если не работают на iOS 7:

@interface ZTTextField : UITextField {
    BOOL _keyboardJustChanged;
}
@property (nonatomic) BOOL keyboardJustChanged;
@end

@implementation ZTTextField
@synthesize keyboardJustChanged = _keyboardJustChanged;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _keyboardJustChanged = NO;
    }
    return self;
}

- (void)insertText:(NSString *)text {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    if (self.keyboardJustChanged == YES) {
        BOOL isIOS7 = NO;
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(backgroundRefreshStatus)]) {
            isIOS7 = YES;
        }
        NSString *currentText = [self text];
        // only mess with editing in iOS 7 when the field is masked, wherein our problem lies
        if (isIOS7 == YES && self.secureTextEntry == YES && currentText != nil && [currentText length] > 0) {
            NSString *newText = [currentText stringByAppendingString: text];
            [super insertText: newText];
        } else {
            [super insertText:text];
        }
        // now that we've handled it, set back to NO
        self.keyboardJustChanged = NO;
    } else {
        [super insertText:text];
    }
#else
    [super insertText:text];
#endif
}

- (void)setKeyboardType:(UIKeyboardType)keyboardType {
    [super setKeyboardType:keyboardType];
    [self setKeyboardJustChanged:YES];
}

@end
0 голосов
/ 05 сентября 2011

Есть еще один пост с вопросом о переполнении стека: Вопрос

Чтение этого сообщения выглядит так, как будто вам нужно установить textField.clearsOnBeginEditing = NO в методе делегирования textFieldShouldBeginEditing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...