2014-09-18 5 views

ответ

5

Это должно работать (вы должны также установить 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; 
} 
+0

Должен ли это быть принятым ответом? –

+0

i подтвержденный ур. но вы должны проверить этот принятый ответ http://stackoverflow.com/questions/21092182/uppercase-characters-in-uitextfield. вам просто нужно textField.text = [textField.text stringByReplacingCharactersInRange: диапазон withString: [string lowercaseString]]; и вернуть НЕТ; – Vats

4

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 
} 
+0

Это не самый лучший подход. Было бы лучше реализовать метод textField: shouldChangeCharactersInRange: replacementString: 'и обновлять каждое изменение по мере его возникновения. – rmaddy

+0

Это срабатывает только после того, как текст появляется в поле, хотя и не приятный UX. – brandonscript

+0

Мой подход на самом деле заставляет строчный регистр вводить пользователя. – rmaddy