Встановіть максимальну довжину символів поля UITextField


474

Як я можу встановити максимальну кількість символів UITextFieldна iPhone SDK під час завантаження UIView?


ця неймовірно стара відповідь дуже застаріла - відповідь зараз тривіальна: stackoverflow.com/a/38306929/294884
Fattie

Відповіді:


1029

Хоча UITextFieldклас не має властивості максимальної довжини, отримати цю функціональність досить просто, встановивши текстове поле delegateта застосувавши такий метод делегування:

Ціль-С

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

Швидкий

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

    let currentCharacterCount = textField.text?.count ?? 0
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentCharacterCount + string.count - range.length
    return newLength <= 25
}

Перед тим, як зміниться текстове поле, UITextField запитує делегата, чи слід змінити вказаний текст . Наразі текстове поле не змінилося, тому ми захоплюємо його поточну довжину та довжину рядка, яку ми вставляємо (або через вставку скопійованого тексту, або введення одного символу за допомогою клавіатури) за вирахуванням довжини діапазону. Якщо це значення занадто довге (більше 25 символів у цьому прикладі), поверніться, NOщоб заборонити зміни.

Під час введення одного символу в кінці текстового поля range.locationбуде вказана довжина поточного поля і range.lengthбуде 0, оскільки ми нічого не замінюємо / видаляємо. Вставлення в середину текстового поля просто означає інше range.location, а вставлення декількох символів просто означає, що в ньому stringє більше одного символу.

Видалення одиночних символів або вирізання декількох символів задається символом a rangeз нульовою довжиною та порожнім рядком. Заміна - це лише видалення діапазону з не порожнім рядком.

Примітка про аварійну помилку "скасувати"

Як згадується в коментарях, є помилка, UITextFieldяка може призвести до аварії.

Якщо ви вставите в поле, але вставку перешкоджає ваша реалізація перевірки, операція вставки все ще записується в буфер скасування програми. Якщо потім ви скасуєте скасування (струшуючи пристрій і підтвердивши скасування), UITextFieldспробу буде замінити рядок, який, на його думку, він вставив у себе порожнім рядком. Це вийде з ладу, тому що він ніколи насправді не вставляв рядок у себе. Він спробує замінити частину рядка, яка не існує.

На щастя, ви можете захистити себе UITextFieldвід вбивства таким чином. Вам просто потрібно переконатися, що діапазон, який він пропонує замінити , існує в його поточному рядку. Ось що робить попередня перевірка санітарності.

Швидкий 3.0 з копією та вставкою, що працює добре.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

Сподіваюся, це вам корисно.


7
Знайшов рішення, оточуючи ці 2 рядки символом if (textField == _ssn) {} і додаючи повернення ТАК; наприкінці методу, який дозволить всім іншим полям UITextFi приймати текст без будь-яких обмежень. Вишуканий!
Кайл Клегг

55
Хороша відповідь, але потрійний оператор зайвий; ви могли просто поставитиreturn newLength <= 25;
jowie

2
Що робити, якщо ви просто хочете, щоб текст не перелив рамку текстового поля; не всі символи однакової ширини, правда?
Моркром

2
Насправді є скасування помилки, як згадує @bcherry - протестовано UITextFieldна iPad iOS 8.1. (+1 для коментаря). Чи додав би автор щось про це, оскільки це найкраща відповідь? Я радий редагувати, але мої регулярно здаються відхиленими! :-)
Benjohn

8
@bherry У Swift перевірка на випадок відміни, здається, порушує запис емоджи. Чи не повинен насправді вважати лічильник (textField.text) (textField.text.utf16), щоб відповідати звіту objc / uikit у діапазоні (проти варіанту рахунку Swift на рядках)?
rcw3

62

Швидкий 4

import UIKit

private var kAssociationKeyMaxLength: Int = 0

extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                return length
            } else {
                return Int.max
            }
        }
        set {
            objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
            addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
        }
    }

    @objc func checkMaxLength(textField: UITextField) {
        guard let prospectiveText = self.text,
            prospectiveText.count > maxLength
            else {
                return
        }

        let selection = selectedTextRange

        let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        let substring = prospectiveText[..<indexEndOfText]
        text = String(substring)

        selectedTextRange = selection
    }
}

Редагувати: виправлено проблему з витоком пам’яті.

введіть тут опис зображення


Чудова ідея Frouo! Я розширив його у своїй відповіді, щоб перемістити обрізку maxLength до розширення String, щоб воно також можна було використовувати для таких речей, як екземпляри UITextView, і щоб додати функцію зручності, щоб скористатися цими розширеннями String у розширенні UITextField.
Скотт Гарднер

1
Чи не ця глобальна змінна не створює витоків пам'яті, зберігаючи посилання на всі текстові перегляди (які посилаються на огляди до root-)
Ixx

3
@Ixx Я відредагував, щоб виправити проблему з витоком пам'яті, яку ви вказали + стрімкий 3. Дякую
frouo

1
найкрасивіший спосіб досягти цього! Спасибі
Віктор Чой

хтось може надати мені свою об’єктивну версію
MRizwan33

56

Дякую серпня! ( Допис )

Це код, який я закінчив, і який працює:

#define MAX_LENGTH 20

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.text.length >= MAX_LENGTH && range.length == 0)
    {
        return NO; // return NO to not change text
    }
    else
    {return YES;}
}

19
На жаль, це рішення не дозволяє зупинити копіювання та вставлення користувачів у текстове поле, тому дозволяє їм обійти межу. Відповідь Сиппі коректно справляється з цією ситуацією.
Мурашка

5
Що з людьми, які мають заяви, якщо повернути НІ чи ТАК? Спробуйте це: поверніть! (TextField.text.length> = MAX_LENGTH && range.length == 0);
Метт Паркінс

або цеreturn textField.text.length < MAX_LENGTH || range.length != 0;
ігрик

22

Для завершення відповіді в серпні можлива реалізація запропонованої функції (див . Делегат UITextField ).

Я не перевіряв код domness , але мій не зациклювався , якщо користувач досяг межі, і він сумісний з новою рядком, який приходить замінити менший або рівний.

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //limit the size :
    int limit = 20;
    return !([textField.text length]>limit && [string length] > range.length);
}

17

Ви не можете це зробити безпосередньо - UITextFieldне має атрибута maxLength , але ви можете встановити UITextField'sделегат, а потім скористатися:

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

5
Я погоджуюся, це найкращий шлях вперед, але це залишається трохи злому. Надішліть звіт про помилку в Apple, що ви хочете побачити властивість на довжину тексту. Мене це однозначно цікавить.
авокада

5
@avocade, це не хакер: це приклад, коли ви повинні робити базовий рамковий код, який Apple повинен був зробити для вас. Є багато прикладів цього в iOS SDK.
Дан Розенстарк

13

Часто у вас є кілька полів введення з різною довжиною.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    int allowedLength;
    switch(textField.tag) {
        case 1: 
            allowedLength = MAXLENGTHNAME;      // triggered for input fields with tag = 1
            break;
        case 2:
            allowedLength = MAXLENGTHADDRESS;   // triggered for input fields with tag = 2
            break;
        default:
            allowedLength = MAXLENGTHDEFAULT;   // length default when no tag (=0) value =255
            break;
    }

    if (textField.text.length >= allowedLength && range.length == 0) {
        return NO; // Change not allowed
    } else {
        return YES; // Change allowed
    }
}

12

Найкращим способом було б налаштувати сповіщення про зміну тексту. У вашому -awakeFromNibспособі контролера перегляду вам потрібно:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitTextField:) name:@"UITextFieldTextDidChangeNotification" object:myTextField];

Потім в той же клас додайте:

- (void)limitTextField:(NSNotification *)note {
    int limit = 20;
    if ([[myTextField stringValue] length] > limit) {
        [myTextField setStringValue:[[myTextField stringValue] substringToIndex:limit]];
    }
}

Потім підключіть розетку myTextFieldдо своєї, UITextFieldі це не дозволить вам додати більше символів після досягнення межі. Обов’язково додайте це до методу угоди:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:myTextField];

Хоча я це робив, щоб видалити помилки> myTextField.text = [myTextField.text substringToIndex: limit];
Лука

11

Я створив цей підклас UITextFieldLimit:

  • Підтримується кілька текстових полів
  • Встановіть межу довжини тексту
  • Профілактика пасти
  • Відображає мітку лівих символів всередині текстового поля, сховайте, коли ви припините редагувати.
  • Потрясіть анімацію, коли не залишилося жодних символів.

Візьміть UITextFieldLimit.hі UITextFieldLimit.mз цього сховища GitHub:

https://github.com/JonathanGurebo/UITextFieldLimit

і починайте тестувати!

Позначте створений UITextField вашої розкадровки та зв’яжіть його з моїм підкласом за допомогою Інспектора ідентичності:

Посвідчення особи

Потім ви можете пов’язати його з IBOutlet і встановити ліміт (за замовчуванням - 10).


Ваш файл ViewController.h повинен містити: (якщо ви не хочете змінювати налаштування, як-от обмеження)

#import "UITextFieldLimit.h"

/.../

@property (weak, nonatomic) IBOutlet UITextFieldLimit *textFieldLimit; // <--Your IBOutlet

Ваш файл ViewController.m повинен @synthesize textFieldLimit.


Встановіть обмеження довжини тексту у файлі ViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    [textFieldLimit setLimit:25];// <-- and you won't be able to put more than 25 characters in the TextField.
}

Сподіваюся, клас вам допоможе. Удачі!


Зважаючи на малу потребу в обмеженні символів, я думаю, що додавання вашого класу було б просто непосильним.
Domness

Все-таки зусилля оцінені.
жнець

11

Цього має бути достатньо для вирішення проблеми (замініть 4 лімітом u want). Просто не забудьте додати делегата в ІБ.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
     NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
     return (newString.length<=4);
}

9

Використовуйте розширення нижче, щоб встановити максимальну довжину символів a UITextFieldі UITextView.

Swift 4.0

    private var kAssociationKeyMaxLength: Int = 0
    private var kAssociationKeyMaxLengthTextView: Int = 0
    extension UITextField {


        @IBInspectable var maxLength: Int {
            get {
                if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                    return length
                } else {
                    return Int.max
                }
            }
            set {
                objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
                addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
            }
        }

        @objc func checkMaxLength(textField: UITextField) {
            guard let prospectiveText = self.text,
                prospectiveText.count > maxLength
                else {
                    return
            }

            let selection = selectedTextRange

            let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
            let substring = prospectiveText[..<indexEndOfText]
            text = String(substring)

            selectedTextRange = selection
        }
    }

UITextView

extension UITextView:UITextViewDelegate {


        @IBInspectable var maxLength: Int {
            get {
                if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLengthTextView) as? Int {
                    return length
                } else {
                    return Int.max
                }
            }
            set {
                self.delegate = self

                objc_setAssociatedObject(self, &kAssociationKeyMaxLengthTextView, newValue, .OBJC_ASSOCIATION_RETAIN)
            }
        }

        public func textViewDidChange(_ textView: UITextView) {
            checkMaxLength(textField: self)
        }
        @objc func checkMaxLength(textField: UITextView) {
            guard let prospectiveText = self.text,
                prospectiveText.count > maxLength
                else {
                    return
            }

            let selection = selectedTextRange

            let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
            let substring = prospectiveText[..<indexEndOfText]
            text = String(substring)

            selectedTextRange = selection
        }
    }

Ви можете встановити ліміт нижче.

введіть тут опис зображення


найкраща відповідь на сьогодні, ,, дякую дуже чудово рішення, коли є багато текстових полів, які потребують різної довжини
Карлос Норена

Дійсно чудове рішення для обмеження введення символів для управління текстовим полем та текстовим полем. Збережіть кодові рядки та час також для розробника ... :)
Sandip Patel - SM

Це працює краще, ніж інші знайдені нами рішення. Наприклад, якщо у вашому текстовому полі є емоджи, інші редакції, які я знайшов, переходять до кінця рядка під час редагування. Але ваш код цього не робить. Дякую!
Фонтайн Джуд

7

Я моделюю фактичну заміну рядка, яка має відбутися для обчислення довжини наступної рядки:

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

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if([newString length] > maxLength)
       return NO;

    return YES;
}

7

Версія Swift 3 // ***** Це НЕ буде працювати з Swift 2.x! ***** //

Спочатку створіть новий файл Swift: TextFieldMaxLength.swift, а потім додайте код нижче:

import UIKit

private var maxLengths = [UITextField: Int]()

extension UITextField {

   @IBInspectable var maxLength: Int {

      get {

          guard let length = maxLengths[self] 
             else {
                return Int.max
      }
      return length
   }
   set {
      maxLengths[self] = newValue
      addTarget(
         self,
         action: #selector(limitLength),
         for: UIControlEvents.editingChanged
      )
   }
}
func limitLength(textField: UITextField) {
    guard let prospectiveText = textField.text,
        prospectiveText.characters.count > maxLength
    else {
        return
    }

   let selection = selectedTextRange
   let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
   text = prospectiveText.substring(to: maxCharIndex)
   selectedTextRange = selection
   }
}

а потім ви побачите на сторінці розкадрування нове поле (максимальна довжина), коли ви виберете будь-яке TextField

якщо у вас є ще запитання, перегляньте це посилання: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -максимальна довжина візуального-студійного стилю /


Застереження, ця глобальна змінна створює витоки пам'яті, зберігаючи посилання на всі текстові огляди.
frouo

6

Використовуючи програму Interface builder, ви можете зв’язати та отримати подію для "Редагування змінено" в будь-якій функції. Тепер ви можете поставити перевірку на довжину

- (IBAction)onValueChange:(id)sender 
{
    NSString *text = nil;
    int MAX_LENGTH = 20;
    switch ([sender tag] ) 
    {
        case 1: 
        {
            text = myEditField.text;
            if (MAX_LENGTH < [text length]) {
                myEditField.text = [text substringToIndex:MAX_LENGTH];
            }
        }
            break;
        default:
            break;
    }

}

6

Наступний код схожий на відповідь серпа, але правильно обробляє операції копіювання та вставки. Якщо ви спробуєте вставити текст, який перевищує межу, наступний код урізає текст, щоб він відповідав межі, а не повністю відмовлявся від операції вставки.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    static const NSUInteger limit = 70; // we limit to 70 characters
    NSUInteger allowedLength = limit - [textField.text length] + range.length;
    if (string.length > allowedLength) {
        if (string.length > 1) {
            // get at least the part of the new string that fits
            NSString *limitedString = [string substringToIndex:allowedLength];
            NSMutableString *newString = [textField.text mutableCopy];
            [newString replaceCharactersInRange:range withString:limitedString];
            textField.text = newString;
        }
        return NO;
    } else {
        return YES;
    }
}

6

У Swift є загальне рішення для встановлення максимальної довжини. За допомогою IBInspectable ви можете додати нові атрибути в інспектор атрибутів Xcode.введіть тут опис зображення

import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            guard let length = maxLengths[self]
            else {
                return Int.max
            }
            return length
        }
        set {
            maxLengths[self] = newValue
            addTarget(
                self,
                action: Selector("limitLength:"),
                forControlEvents: UIControlEvents.EditingChanged
            )
        }
    }

    func limitLength(textField: UITextField) {
        guard let prospectiveText = textField.text
            where prospectiveText.characters.count > maxLength else {
                return
        }
        let selection = selectedTextRange
        text = prospectiveText.substringWithRange(
            Range<String.Index>(prospectiveText.startIndex ..< prospectiveText.startIndex.advancedBy(maxLength))
        )
        selectedTextRange = selection
    }

}

Чисте і ідеальне рішення
Едуардо

Утримання UITextField у глобальному полі збереже їх у пам’яті навіть після звільнення UIViewController. Це витік пам'яті. Не використовуйте цей метод.
Гуньхан

5

Щоб він працював із вирізанням та вставкою рядків будь-якої довжини, я б запропонував змінити функцію на щось на зразок:

#define MAX_LENGTH 20

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSInteger insertDelta = string.length - range.length;

        if (textField.text.length + insertDelta > MAX_LENGTH)
        {
           return NO; // the new string would be longer than MAX_LENGTH
        }
        else {
            return YES;
        }
    }

4

Швидкий 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let newLength = text.count + string.count - range.length
    return newLength <= 10
}

Чому guard?
oddRaven

перевірте, чи є текст нульовим, якщо ви хочете, ви також можете скористатися if @oddRaven
Shan Ye

3

Швидкий 2.0 +

Перш за все створити клас для цього процесу. Давайте назвемо це StringValidator.swift.

Потім просто вставте наступний код всередину нього.

import Foundation

extension String {

func containsCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) != nil
}

func containsOnlyCharactersIn(matchCharacters: String) -> Bool {
let disallowedCharacterSet = NSCharacterSet(charactersInString: matchCharacters).invertedSet
return self.rangeOfCharacterFromSet(disallowedCharacterSet) == nil
}


func doesNotContainCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) == nil
}

func isNumeric() -> Bool
{
let scanner = NSScanner(string: self)
scanner.locale = NSLocale.currentLocale()

return scanner.scanDecimal(nil) && scanner.atEnd
}

}

Тепер збережіть клас .....

Використання ..

Тепер перейдіть до класу viewController.swift і зробіть розетки вашого текстового поля як ..

@IBOutlet weak var contactEntryTxtFld: UITextField! //First textfield
@IBOutlet weak var contactEntryTxtFld2: UITextField!   //Second textfield

Тепер перейдіть до методу textChangeCharactersInRange у текстовому полі та використовуйте наступне.

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if string.characters.count == 0 {
        return true
    }
    let latestText = textField.text ?? ""
    let checkAbleText = (latestText as NSString).stringByReplacingCharactersInRange(range, withString: string)


    switch textField {

    case contactEntryTxtFld:
        return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5

    case contactEntryTxtFld2:
        return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5

    default:
        return true
    }

}

Не забудьте встановити протокол / методи текстових полів делегата.

Дозвольте мені пояснити про це ... Я використовую простий процес розширення рядка, який я написав всередині іншого класу. Тепер я просто викликаю ці методи розширення з іншого класу, де мені потрібні, додаючи чек та максимальне значення.

Гості ...

  1. Він встановить максимальний ліміт певного текстового поля.
  2. Він встановить тип прийнятих ключів для конкретного текстового поля.

Типи ...

міститьOnlyCharactersIn // Приймає лише символи.

міститьCharactersIn // Приймає поєднання символів

doesNotContainsCharactersIn // Не прийме символів

Сподіваюся, це допомогло .... Дякую ..


3

швидкий 3.0

Цей код працює добре, коли ви вставляєте рядок більше, ніж обмежує кількість символів.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

Дякуємо за ваші голоси. :)


2
UITextField, а не UITextView.
Джоні

3

Я даю додаткову відповідь на основі @Frouo. Я думаю, що його відповідь - найкрасивіший спосіб. Тому що це загальний контроль, який ми можемо використовувати повторно.

private var kAssociationKeyMaxLength: Int = 0

extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                return length
            } else {
                return Int.max
            }
        }
        set {
            objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
            self.addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
        }
    }

    func checkMaxLength(textField: UITextField) {

        guard !self.isInputMethod(), let prospectiveText = self.text,
            prospectiveText.count > maxLength
            else {
                return
        }

        let selection = selectedTextRange
        let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        text = prospectiveText.substring(to: maxCharIndex)
        selectedTextRange = selection
    }

    //The method is used to cancel the check when use Chinese Pinyin input method.
    //Becuase the alphabet also appears in the textfield when inputting, we should cancel the check.
    func isInputMethod() -> Bool {
        if let positionRange = self.markedTextRange {
            if let _ = self.position(from: positionRange.start, offset: 0) {
                return true
            }
        }
        return false
    }

}

2

Це правильний спосіб обробки максимальної довжини на UITextField, він дозволяє клавіші повернення вийти у відставку з текстового поля як перший відповідач і дає можливість повернутися до зворотного простору користувача, коли вони досягнуть межі

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
int MAX_LENGHT = 5;
    if([string isEqualToString:@"\n"])
    {
        [textField resignFirstResponder];
        return FALSE;
    }
    else if(textField.text.length > MAX_LENGHT-1)
    {
        if([string isEqualToString:@""] && range.length == 1)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    else
    {
        return TRUE;
    }
}

2

Як щодо цього простого підходу. Це працює добре для мене.

extension UITextField {

    func  charactersLimit(to:Int) {

        if (self.text!.count > to) {
            self.deleteBackward()
        }
    }
}

Тоді:

someTextField.charactersLimit(to:16)

1

Інші відповіді не стосуються випадку, коли користувач може вставити довгий рядок із буфера обміну. Якщо я вставляю довгу нитку, її слід просто врізати, але показати. Використовуйте це у своєму делегаті:

static const NSUInteger maxNoOfCharacters = 5;

-(IBAction)textdidChange:(UITextField * )textField
{
NSString * text = textField.text;

if(text.length > maxNoOfCharacters)
{
    text = [text substringWithRange:NSMakeRange(0, maxNoOfCharacters)];
    textField.text = text;
}

// use 'text'

}

1

Звели його до 1 рядка коду :)

Встановіть делегата вашого текстового перегляду на "Я", а потім додайте <UITextViewDelegate>у.

-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
    return ((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length)>0);
}

Цей код обліковий запис для введення нових символів, видалення символів, вибору символів, а потім введення або видалення, вибору символів і вирізання, вставки загалом, а також вибору символів та вставки.

Готово!






Крім того, ще один класний спосіб написати цей код за допомогою бітових операцій

-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
    return 0^((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length));
}


1

тепер скільки символів u хочете просто дати значення

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range   replacementString:(NSString *)string {
     NSUInteger newLength = [textField.text length] + [string length] - range.length;
     return (newLength > 25) ? NO : YES;
  }

1

Використовуйте цей код тут RESTRICTED_LENGTH - це довжина, яку ви хочете обмежити для текстового поля.

   - (BOOL)textField:(UITextField *)textField     shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == nameTF) {
    int limit = RESTRICTED_LENGTH - 1;
    return !([textField.text length]>limit && [string length] > range.length);
    }
   else
   {
    return YES;
   }

return NO;

}

1

Я робив це в Swift для обмеження 8 символів при використанні цифрової колодки.

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

Мені довелося перевірити рядок! = "", Щоб дозволити кнопку видалення працювати на цифровій колодці, інакше вона не дозволить видалити символи в текстовому полі після того, як вона досягла своєї макс.


1

Для Xamarin:

YourTextField.ShouldChangeCharacters = 
delegate(UITextField textField, NSRange range, string replacementString)
        {
            return (range.Location + replacementString.Length) <= 4; // MaxLength == 4
        };

1

Я реалізував розширення UITextField, щоб додати до нього властивість maxLength.

Він заснований на Xcode 6 IBInspectables, тому ви можете встановити обмеження maxLength на конструкторі інтерфейсів.

Ось реалізація:

UITextField + MaxLength.h

#import <UIKit/UIKit.h>

@interface UITextField_MaxLength : UITextField<UITextFieldDelegate>

@property (nonatomic)IBInspectable int textMaxLength;
@end

UITextField + MaxLength.m

#import "UITextField+MaxLength.h"

@interface UITextField_MaxLength()

@property (nonatomic, assign) id <UITextFieldDelegate> superDelegate;

@end

@implementation UITextField_MaxLength

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

    //validate the length, only if it's set to a non zero value
    if (self.textMaxLength>0) {
        if(range.length + range.location > textField.text.length)
            return NO;

        if (textField.text.length+string.length - range.length>self.textMaxLength) {
            return NO;
        }
    }

    //if length validation was passed, query the super class to see if the delegate method is implemented there
    if (self.superDelegate && [self.superDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
        return [self.superDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
    }
    else{
        //if the super class does not implement the delegate method, simply return YES as the length validation was passed
        return YES;
    }
}

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    if (delegate == self)
        return;
    self.superDelegate = delegate;
    [super setDelegate:self];
}

//forward all non overriden delegate methods
- (id)forwardingTargetForSelector:(SEL)aSelector {
    if ([self.superDelegate  respondsToSelector:aSelector])
        return self.superDelegate;

    return [super forwardingTargetForSelector:aSelector];
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    if ([self.superDelegate respondsToSelector:aSelector])
        return YES;

    return [super respondsToSelector:aSelector];
}
@end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.