Я хочу переопределить событие нажатой клавиши, чтобы заставить это, даже когда нажата клавиша капитала, результирующий вывод по-прежнему строчный.Как заставить UITextField поддерживать только строчные буквы?
ответ
Это должно работать (вы должны также установить textfield.autocapitalizationType = UITextAutocapitalizationTypeNone)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField==_usernameTextfield || textField==_emailTextfield) {
NSRange lowercaseCharRange;
lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]];
if (lowercaseCharRange.location != NSNotFound) {
// some uppercase chars where found, need to replace
UITextPosition *beginning = textField.beginningOfDocument;
UITextPosition *start = [textField positionFromPosition:beginning offset:range.location];
// new cursor location after insert/paste/typing
NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length;
// convert whole text to lowercase and update the textfield
textField.text = [textField.text stringByReplacingCharactersInRange:range
withString:[string lowercaseString]];
// now reposition the cursor
UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset];
UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition];
[textField setSelectedTextRange:newSelectedRange];
return NO;
}
}
return YES;
}
Solution является добавление селектор для textFieldDidChange
:
[self addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
И в textFieldDidChange
случае, добавьте следующее:
- (void)textFieldDidChange:(UITextField*)textField {
textField.text = [textField.text lowercaseString];
}
Или вы можете использовать Interface Builder @IBAction
Редактирование Изменено
Swift 2 версия:
@IBAction func textChanged(sender: UITextField) {
sender.text = sender.text?.lowercaseString
}
Это не самый лучший подход. Было бы лучше реализовать метод textField: shouldChangeCharactersInRange: replacementString: 'и обновлять каждое изменение по мере его возникновения. – rmaddy
Это срабатывает только после того, как текст появляется в поле, хотя и не приятный UX. – brandonscript
Мой подход на самом деле заставляет строчный регистр вводить пользователя. – rmaddy
Должен ли это быть принятым ответом? –
i подтвержденный ур. но вы должны проверить этот принятый ответ http://stackoverflow.com/questions/21092182/uppercase-characters-in-uitextfield. вам просто нужно textField.text = [textField.text stringByReplacingCharactersInRange: диапазон withString: [string lowercaseString]]; и вернуть НЕТ; – Vats