簡體   English   中英

UItextfield中的大寫字符

[英]Uppercase characters in UItextfield

我有一個關於iOS UIKeyboard的問題。

我有一個UITextField ,我希望keyboard只有大寫字符。

我使用storyboard並嘗試將Cpitalization設置為“ All characters ”到UITextField properties

但這不能解決我的問題……有什么建議嗎?

在 UITextField UITextAutocapitalizationTypeAllCharacters文本字段類型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;
}

我對上述一些答案的一個問題是,如果您嘗試設置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
}

對於那些尋找 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屬性只是強制鍵盤在大寫鎖定的情況下打開,但允許用戶將其關閉。

語法現在是

斯威夫特 2

textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters

斯威夫特 3

textField.autocapitalizationType = .allCharacters

這是我使用的一種不同的方法,它執行以下操作:

  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
}

我選擇這個是為了避免用戶看到一些大寫的不均勻體驗,但一旦他們移動到下一個字符就改變了。

你應該避免使用委托方法

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

UITextField屬性autocapitalizationType設置為UITextAutocapitalizationTypeAllCharacters 這將使所有字符以大寫形式出現。 另請訪問此處以了解有關文本字段的更多信息

斯威夫特 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
    }
}

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

ViewDidLoad/ViewDidAppear 中只有一行代碼:

如果您只想查看鍵入的字符,而不管大寫/小寫到所有大寫/大寫,請在 ViewDidLoad/ViewDidAppear 中粘貼下面的代碼

self.myTextField.autocapitalizationType = .allCharacters

當您自動鍵入時,以上行將所有字母更改為大寫

用戶界面

對於 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.

您也可以使用此代碼。

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

最簡單的方法是實現文本字段的編輯更改方法,並將文本字段的文本值設置為輸入文本的大寫表示。

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

最后,我找到了在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
}

也許這里的答案有點晚了,但由於我有一個可行的解決方案,有人可能會發現它很有用。

那么,在下面的文本字段委托方法中,檢查新字符串是否包含任何小寫字符。 如果是這樣,那么:

  • 將剛剛輸入的字符附加到文本字段的文本中。
  • 使所有文本字段的文本大寫。
  • 確保該方法返回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
}

以上對我來說非常有效,並且在首先進行適當的調整之后,類似的實現也適用於文本視圖。

希望能幫助到你!

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

這是我的情況以及我如何強制上層文字:

  • 自定義類( 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
}

即使用戶在“中間”添加文本,這也會將光標始終設置在正確的位置(它所在的位置)。

在文本更改時,我們可以更改為大寫

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

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

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


}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM