【问题标题】:Uppercase characters in UItextfieldUItextfield 中的大写字符
【发布时间】:2014-02-01 06:02:16
【问题描述】:

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

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

我使用storyboard 并尝试将Cpitalization 设置为“All characters”为UITextField properties

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

【问题讨论】:

标签: ios iphone uitextfield uistoryboard


【解决方案1】:

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

斯威夫特 5.4.2

       self.yourTextField.autocapitalizationType = .allCharacters

【讨论】:

  • 这不适用于粘贴文本,因为string 可以有多个小写字符。
  • 我的错,你的代码有效。我认为代码只会将找到的小写字符大写。 [string uppercaseString] 将所有字符大写。
  • 这样不行,因为如果用户在文本中间输入文本,选择会突然跳到文本末尾。
  • @matt 查看我的解决方案stackoverflow.com/a/54634230/4600723 我找到了如何将光标保持在用户位置的方法。
  • 注意:如果您在中间,这将导致光标跳到文本字段的末尾。使用此处的代码跟踪、调整和设置所选范围:stackoverflow.com/q/26284271/2057171 --- 次要注意:不确定范围如何与 rightToLeft 语言一起使用
【解决方案2】:

我对上述一些答案的一个问题是,如果您尝试设置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
}

【讨论】:

  • 这个答案应该被方式赞成(并接受)。此页面上的所有其他内容,直接设置文本字段的text,是完全错误的。
  • 什么是textFieldToUppercase
  • @Slaknation 这是一个比较来检查这是否是正确的文本字段。通常,您会将同一个委托设置为多个文本字段,因此将为所有文本字段调用该函数。
【解决方案3】:

对于那些寻找 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 属性只会强制键盘在大写锁定打开的情况下打开,但允许用户将其关闭。

【讨论】:

  • 在 Swift 2.3 中不再工作,因为不允许从 String 转换为 NSString。
【解决方案4】:

现在的语法是

斯威夫特 2

textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters

斯威夫特 3

textField.autocapitalizationType = .allCharacters

【讨论】:

  • 这不会阻止用户输入小写字符。它只是在键盘上设置 Capslock 键。如果用户点击它,小写输入是可能的。
【解决方案5】:

这是我使用的另一种方法,它执行以下操作:

  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
}

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

【讨论】:

  • 谢谢@CodeBender,这就是我要找的。​​span>
  • 简单而流畅,最适合我的目的。
  • 我认为如果他们在字符串中途编辑文本,这会丢失用户的光标位置 - 光标会跳到文本的末尾。
【解决方案6】:

你应该避免使用委托方法

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

因为这将触发 iOS 13 + QuickPath 键入(iOS 的 Swiftkey 键盘对应项)的不良行为。

如果您在键盘上滑动并输入“hello”,它会在文本字段中写入“HELLOHELLOHELLOHELLOHELLO”。这是因为该方法被多次调用,并通过textField.text = uppercasedValue 附加刚刚更改的文本。

正确的方法是观察.editingChange事件和大写然后是值。例如:

func awakeFromNib() {
    textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
}

@objc func textFieldDidChange() {
    textField.text = textField.text?.uppercased()
}

【讨论】:

    【解决方案7】:

    UITextField 属性autocapitalizationType 设置为UITextAutocapitalizationTypeAllCharacters。这将使所有字符以大写形式出现。另请访问here 以了解有关文本字段的更多信息

    【讨论】:

    • 我正在使用它,但它什么也没做。你知道为什么吗?
    • 只是为了让其他人知道,如果他们禁用键盘上的大写锁定,这种方法不会阻止用户输入小写字符。
    【解决方案8】:

    SwiftUI

    对于 SwiftUI,自动大写和键盘类型选择的语法是:

    TextField("Your Placeholder", text: $emailAddress)
         .keyboardType(.emailAddress)
         .autocapitalization(.none)
    

    您可以使用以下选项进行自动大写:

    .none //Specifies that there is no automatic text capitalization.
    
    .words //Specifies automatic capitalization of the first letter of each word.
    
    .sentences //Specifies automatic capitalization of the first letter of each sentence.
    
    .allCharacters //Specifies automatic capitalization of all characters, such as for entry of two-character state abbreviations for the United States.
    

    【讨论】:

      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

        斯威夫特 3 / 斯威夫特 4 / 斯威夫特 5

        ViewDidLoad/ViewDidAppear 中只有一行代码:

        如果您只是想查看键入的字符,而不管所有大写/小写到所有大写/大写,请将以下代码粘贴到 ViewDidLoad/ViewDidAppear 中

        self.myTextField.autocapitalizationType = .allCharacters

        在您自动输入时,上面一行会将所有字母变为大写

        【讨论】:

        • 这是最好的解决方案!谢谢!
        • 并非在所有设置中都是最好的。如果您只需要将键盘设置为全部大写,则此方法有效。但用户可以单击键盘上的 shift 键关闭,或者他们可以从另一个应用程序复制和粘贴。另外:请注意,这与 textField 的属性检查器选择相同:“文本输入特征”>“大写”>“所有字符”。无需代码即可实现相同的目标。对于所有情况下的全部大写,请参阅上面的其他选项。
        【解决方案11】:

        您也可以使用此代码。

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

        【讨论】:

        • 我将添加到 viewcontroller.m 但是当我输入字符不是大写时:(
        【解决方案12】:

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

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

        【讨论】:

          【解决方案13】:

          最后我找到了在UITextField 的字符串中间编辑文本的方法。

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

          最后一件事是返回 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
          }
          

          【讨论】:

          【解决方案14】:

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

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

          • 将刚刚输入的字符附加到文本字段的文本中。
          • 将所有文本字段的文本设为大写。
          • 确保该方法返回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,当然首先要进行适当的调整。

          希望对你有帮助!

          【讨论】:

            【解决方案15】:
            /**
             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
            }
            

            【讨论】:

              【解决方案16】:

              这是我的情况以及我如何实现强制上部文字:

              • 自定义类(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
              }
              

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

              【讨论】:

                【解决方案17】:

                使用以下文本字段委托方法可以做到:

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

                希望这会有所帮助。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2010-09-30
                  • 2016-01-01
                  • 2015-09-30
                  • 1970-01-01
                  • 2018-03-12
                  • 2019-11-22
                  相关资源
                  最近更新 更多