UItextfield中的大写字符

问题描述 投票:46回答:15

我有一个关于iOS UIKeyboard的问题。

我有一个UITextField,我希望keyboard只有大写字符。

我使用storyboard,我试图将Cpitalization设置为“All characters”到UITextField properties

但这不能解决我的问题......有什么建议吗?

ios iphone uitextfield uistoryboard
15个回答
91
投票

在UITextField上将文本字段类型autocapitalizationType设置为UITextAutocapitalizationTypeAllCharacters

self.yourTexField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;

致电委托后

//委托方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSRange lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];

    if (lowercaseCharRange.location != NSNotFound) {
        textField.text = [textField.text stringByReplacingCharactersInRange:range
                                                                 withString:[string uppercaseString]];
        return NO;
    }

    return YES;
}

1
投票

最后,我找到了尊重UITextField中字符串中间编辑文本的方式。

问题是,如果用UITextFiled.text属性替换整个文本,实际光标将移动到文本结尾。因此,您需要使用.replace()方法准确指定要更新到upperCase的字符。

最后一件事是将string.isEmpty作为函数的返回值返回 - 否则你不允许删除文本。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let text = textField.text, let textRange = Range(range, in: text) {
        let uppercasedString = string.uppercased()
        let updatedText = text.replacingCharacters(in: textRange, with: uppercasedString)
        if let selectedTextRange = textField.selectedTextRange {
            textField.replace(selectedTextRange, withText: uppercasedString)
            approveButtonState(vin: updatedText)
        }
        return string.isEmpty
    }
    return false
}

1
投票

Just one line code in ViewDidLoad/ViewDidAppear:

如果你只想在ViewDidLoad / ViewDidAppear下面的代码下面的所有CAPITALS / UPPER CASE粘贴中看到输入的字符,无论UPPER /小写如何

self.MyTextField.autocapitalizationType = .allCharacters

当您自动键入时,上面的行会将所有字母更改为CAPITALS


0
投票

也许这里的答案有点晚了,但是由于我有一个有效的解决方案,有人可能觉得它很有用。

好吧,在下面的textfield委托方法中,检查新字符串是否包含任何小写字符。如果是这样,那么:

  • 将刚刚键入的字符附加到文本字段的文本中。
  • 使所有textfield的文本都大写。
  • 确保方法返回false

否则只返回true并让方法按预期工作。

这是它的实现:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    var returnValue = true
    let lowercaseRange = string.rangeOfCharacter(from: CharacterSet.lowercaseLetters)
    if let _ = lowercaseRange?.isEmpty {
        returnValue = false
    }

    if !returnValue {
        textField.text = (textField.text! + string).uppercased()
    }

    return returnValue
}

以上对我来说非常有效,当然,在进行适当的调整之后,类似的实现也适用于textviews。

希望能帮助到你!


0
投票
/**
 We take full control of the text entered so that lowercase cannot be inserted
 we replace lowercase to uppercase
*/
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // No spaces allowed
    if string == " " {
        return false
    }

    // delete key pressed
    if string == "" {
        textField.deleteBackward()
        return false
    }

    // We only allow alphabet and numbers
    let numbersAndLettersSet = CharacterSet.alphanumerics
    if string.lowercased().rangeOfCharacter(from: numbersAndLettersSet) == nil {
        return false
    }

    // Add the entered text
    textField.insertText(string.uppercased())

    // Return false as we are doing full control
    return false
}

0
投票

这里有我的情况以及我如何强制强制上面的文字:

  • 自定义类(UITextField子类)
  • 不想使用委托UITextFieldDelegate方法

@CodeBender提出的解决方案几乎就是我所寻找的,但是从@Dan注意到,光标总是跳到最后。

class MyCustomTextField: UITextField {
...
addTarget(self, action: #selector(upperText), for: .editingChanged)
...
...
@objc private func upperText() {
    let textRange = selectedTextRange
    text = text?.uppercased()
    selectedTextRange = textRange
}

即使用户在“中间”添加文本,这也会将光标始终设置在正确的位置(它的位置)。


-1
投票

使用以下文本字段委托方法可以完成:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
//--- Making uppercase ---//
        if (textField == yourTextField ) {
            NSRange lowercaseCharRange;
            lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];

            if (lowercaseCharRange.location != NSNotFound) {

                textField.text = [textField.text stringByReplacingCharactersInRange:range
                                                                         withString:[string uppercaseString]];
                return NO;
            }
        }


}

希望这可以帮助。


19
投票

对于那些寻找Swift版本的人。

斯威夫特4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())

    return false
}

原始答案

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    textField.text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string.uppercaseString)

    return false
}

使用Capitalization: All Characters属性只是强制键盘打开,大写锁定,但让用户关闭它。


15
投票

我对上述一些答案的一个问题是,如果你尝试设置textfield.text,你将失去光标位置。因此,如果用户尝试编辑文本的中间部分,光标将跳转到结尾。

这是我的Swift解决方案,仍然使用UITextFieldDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if textField == textFieldToUppercase {
        if string == "" {
            // User presses backspace
            textField.deleteBackward()
        } else {
            // User presses a key or pastes
            textField.insertText(string.uppercaseString)
        }
        // Do not let specified text range to be changed
        return false
    }

    return true
}

14
投票

语法现在

斯威夫特2

textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters

斯威夫特3

textField.autocapitalizationType = .allCharacters

4
投票

UITextField属性autocapitalizationType设为UITextAutocapitalizationTypeAllCharacters。这将使所有字符以大写字母显示。另请访问here以查找有关文本字段的更多信息


3
投票

这是我使用的不同方法,它执行以下操作:

  1. 输入字符后立即执行大写
  2. 捕获用户禁用大写锁定的情况,即使文本字段设置为自动大写
  3. 允许轻松编辑
  4. 适用于Swift 2.2

首先,只要在文本字段中发生任何更改,就会注册要更新的通知。

    textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

然后,实施textFieldDidChange

func textFieldDidChange(textField: UITextField) {
    textField.text = textField.text?.uppercaseString
}

我之所以选择此选项是为了避免用户看到某些大写字母的不均匀体验,但一旦移动到下一个字符就会改变。


3
投票

Swift 4.0版本:

首先将要大写的文本字段的委托设置为当前的ViewController(单击从文本字段拖动到currentViewController以设置委托)。

添加扩展名后:

extension CurrentViewController: UITextFieldDelegate{

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        //refference to the textfield you want to target
        if textField.tag == 5{
            textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
            return false
        }
        return true
    }
}

1
投票

您也可以使用此代码。

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range     replacementString:(NSString *)string{

    // Uppercase for string which you need 
    textField.text = [textField.text stringByReplacingCharactersInRange:range 
                                 withString:[string uppercaseString]];

    // return NO because You have already done it in above code
    return NO;
}

1
投票

最简单的方法是实现文本字段的编辑更改方法,并将文本字段的文本值设置为输入文本的大写表示。

@property (nonatomic, strong) IBOutlet UITextField *yourTextfield

// add target in code or use interface builder
[self.yourTextField addTarget:self 
                       action:@selector(uppercaseTextField)
             forControlEvents:UIControlEventEditingChanged];

- (IBAction)uppercaseTextField:(UITextField*)textField
{
    textField.text = [textField.text uppercaseString];
}
© www.soinside.com 2019 - 2024. All rights reserved.