Установите максимальную длину символа UITextField - PullRequest
459 голосов
/ 11 января 2009

Как установить максимальное количество символов в UITextField на iPhone SDK при загрузке UIView?

Ответы [ 43 ]

1 голос
/ 06 июня 2018

Вы также можете сделать это с помощью NotificationCenter в Swift 4

NotificationCenter.default.addObserver(self, selector: #selector(self.handleTextChange(recognizer:)), name: NSNotification.Name.UITextFieldTextDidChange, object: yourTextField)

    @objc func handleTextChange(recognizer: NSNotification) {
            //max length is 50 charater max
            let textField = recognizer.object as! UITextField

            if((textField.text?.count)! > 50) {
                let newString: String? = (textField.text as NSString?)?.substring(to: 50)
                textField.text = newString

            }         
        }
1 голос
/ 30 ноября 2016

Если ваша цель ограничения количества текста состоит в том, чтобы текст вписывался в UILabel где-либо еще, я бы не стал использовать количество символов. Это приводит к тому, что некоторые эмодзи ломаются (попытка обрезать эмодзи двойного размера может привести к сбою в вашем приложении). Это также проблема с некоторыми языками, такими как японский и китайский, которые имеют двухступенчатый процесс ввода, при котором простой подсчет просто не работает.

Я создал выпадающий подкласс UITextField ( MPC_CharacterLimitedTextField на github ). Вы передаете ему ожидаемую ширину выходной метки, и она будет обрабатывать все языки, эмодзи и проблемы вставки. Он будет собирать только столько полных символов, которые поместятся в метку, независимо от количества символов. В проекте есть демо, так что вы можете проверить его, чтобы увидеть, что вам нужно. Надеюсь, это поможет всем, у кого были те же проблемы с длиной вывода, что и у меня.

1 голос
/ 20 января 2016

Я сделал это в Swift для ограничения в 8 символов при использовании цифровой клавиатуры.

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return !(textField.text?.characters.count == MAX_LENGTH && string != "")
}

Мне пришлось проверить строку! = "", Чтобы кнопка удаления работала на цифровой клавиатуре, иначе она не позволила бы удалить символы в текстовом поле после того, как оно достигло максимального значения.

0 голосов
/ 19 марта 2010

Я нашел это быстро и просто

- (IBAction)backgroundClick:(id)sender {
    if (mytext.length <= 7) {
        [mytext resignFirstResponder];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Too Big" 
                                                        message:@"Please Shorten Name"
                                                       delegate:nil 
                                              cancelButtonTitle:@"Cancel"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
}
0 голосов
/ 21 марта 2014

Проблема с некоторыми из ответов, приведенных выше, например, у меня есть текстовое поле, и я должен установить ограничение на ввод 15 символов, затем оно останавливается после ввода 15-го символа. но они не позволяют удалить. То есть кнопка удаления тоже не работает. Как я столкнулся с той же проблемой. Вышел с решением, приведенным ниже. Работает идеально для меня

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 if(textField.tag==6)
 {
    if ([textField.text length]<=30)
    {
        return YES;   
    }
    else if([@"" isEqualToString:string])
    {
        textField.text=[textField.text substringToIndex:30 ];
    }

    return NO;
 }
 else
 {
    return YES;
 }
}

У меня есть текстовое поле, тег которого я установил "6" и я ограничил максимальный предел символа = 30; отлично работает в любом случае

0 голосов
/ 19 мая 2014
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if ([txt_name.text length]>100)
    {
        return NO;
    }

    return YES;
}
0 голосов
/ 28 июня 2017

для Swift 3.1 или более поздней версии

сначала добавить протокол UITextFieldDelegate

как: -

class PinCodeViewController: UIViewController, UITextFieldDelegate { 
.....
.....
.....

}

после этого создайте свой UITextField и установите делегата

Полное описание: -

import UIKit

class PinCodeViewController: UIViewController, UITextFieldDelegate {

let pinCodetextField: UITextField = {
    let tf = UITextField()
    tf.placeholder = "please enter your pincode"
    tf.font = UIFont.systemFont(ofSize: 15)
    tf.borderStyle = UITextBorderStyle.roundedRect
    tf.autocorrectionType = UITextAutocorrectionType.no
    tf.keyboardType = UIKeyboardType.numberPad
    tf.clearButtonMode = UITextFieldViewMode.whileEditing;
    tf.contentVerticalAlignment = UIControlContentVerticalAlignment.center
 return tf
  }()


 override func viewDidLoad() {
   super.viewDidLoad()
   view.addSubview(pinCodetextField)
    //----- setup your textfield anchor or position where you want to show it----- 


    // after that 
pinCodetextField.delegate = self // setting the delegate

 }
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return !(textField.text?.characters.count == 6 && string != "")
     } // this is return the maximum characters in textfield 
    }
0 голосов
/ 07 апреля 2017

Я хочу добавить к ответу, данному @ sickp.

В его Swift коде есть проблема, которая возникает с любым многобайтовым текстом (например, эмодзи). NSRange и String в Swift несовместимы, поэтому досадно, что класс делегатов объединяет их. Хитрость заключается в простом преобразовании String объектов в NSString. Правильное решение, основанное на том, что написал @sickp, на самом деле таково:

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

    let currentText = (textField.text as NSString?) ?? NSString()
    let currentCharacterCount = currentText.length
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentText.replacingCharacters(in: range, with: string).characters.count
    return newLength <= 25
}
0 голосов
/ 20 мая 2014

мы можем установить диапазон текстового поля следующим образом ..

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string
{
     int setrange = 20;
     return !([textField.text length]>setrange && [string length] > range.length);
}
0 голосов
/ 28 мая 2014

Это ограничивает количество символов, но также убедитесь, что вы можете вставить в поле до максимального ограничения.

- (void)textViewDidChange:(UITextView *)textView
{
    NSString* str = [textView text];
    str = [str substringToIndex:MIN(1000,[str length])];
    [textView setText:str];

    if([str length]==1000) {
        // show some label that you've reached the limit of 1000 characters
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...