ios - UITextField की अधिकतम वर्ण लंबाई सेट करें




objective-c cocoa-touch (20)

स्विफ्ट 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
    }

आपके वोटों के लिए धन्यवाद। :)

जब मैं UIView लोड करता हूं तो मैं आईफोन एसडीके पर UITextField में अधिकतम वर्ण कैसे सेट कर सकता हूं?


स्विफ्ट 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
    }
}

संपादित करें: स्मृति रिसाव मुद्दा तय किया गया।


अक्सर आपके पास एक अलग लंबाई के साथ कई इनपुट फ़ील्ड होते हैं।

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

अन्य उत्तरों उस मामले को संभाल नहीं पाते हैं जहां उपयोगकर्ता क्लिपबोर्ड से लंबी स्ट्रिंग पेस्ट कर सकता है। यदि मैं एक लंबी स्ट्रिंग पेस्ट करता हूं तो इसे छोटा कर दिया जाना चाहिए लेकिन दिखाया गया है। इसे अपने प्रतिनिधि में प्रयोग करें:

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'

}

आप इसे सीधे नहीं कर सकते - UITextField में कोई अधिकतम लम्बाई विशेषता नहीं है, लेकिन आप UITextField's प्रतिनिधि को सेट कर सकते हैं, फिर उपयोग करें:

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

इंटरफेस बिल्डर का उपयोग करके आप अपने किसी भी फ़ंक्शन में "संपादन बदलना" के लिए ईवेंट को लिंक और प्राप्त कर सकते हैं। अब आप लंबाई के लिए जांच डाल सकते हैं

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

}

इसे किसी भी लंबाई के तारों के कट और पेस्ट के साथ काम करने के लिए, मैं सुझाव देता हूं कि फ़ंक्शन को कुछ इस तरह बदलना:

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

इसे कोड की 1 पंक्ति तक नीचे मिला :)

अपने टेक्स्ट व्यू के प्रतिनिधि को "स्वयं" पर सेट करें, फिर अपने .h में <UITextViewDelegate> जोड़ें और अपने .m में निम्न कोड जोड़ें .... आप जो कुछ भी चाहते हैं उसके लिए संख्या "7" समायोजित कर सकते हैं हो।

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

जबकि 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?.characters.count ?? 0
    if (range.length + range.location > currentCharacterCount){
        return false
    }
    let newLength = currentCharacterCount + string.characters.count - range.length
    return newLength <= 25
}

टेक्स्ट फ़ील्ड में बदलाव होने से पहले, UITextField प्रतिनिधि से पूछता है कि निर्दिष्ट टेक्स्ट बदला जाना चाहिए। टेक्स्ट फ़ील्ड इस बिंदु पर नहीं बदला है, इसलिए हम इसकी वर्तमान लंबाई और स्ट्रिंग लम्बाई जिसे हम सम्मिलित कर रहे हैं (या तो कॉपी किए गए टेक्स्ट पेस्ट करके या कीबोर्ड का उपयोग करके एक ही अक्षर टाइप करके), रेंज की लंबाई घटाएं। यदि यह मान बहुत लंबा है (इस उदाहरण में 25 से अधिक वर्ण), परिवर्तन को प्रतिबंधित करने के लिए NO वापस करें।

टेक्स्ट फ़ील्ड के अंत में एक ही वर्ण में टाइप करते range.location , range.location वर्तमान फ़ील्ड की लंबाई होगी, और range.length लम्बाई 0 होगी क्योंकि हम कुछ भी बदल नहीं रहे हैं / हटा रहे हैं। एक टेक्स्ट फ़ील्ड के बीच में डालने का मतलब सिर्फ एक अलग range.location , और कई वर्णों को पेस्ट करने का मतलब है कि string में एक से अधिक वर्ण हैं।

एकल अक्षरों को हटाने या एकाधिक अक्षरों को काटने को एक गैर-शून्य लंबाई, और एक खाली स्ट्रिंग के साथ निर्दिष्ट किया जाता है। प्रतिस्थापन एक गैर-खाली स्ट्रिंग के साथ केवल एक श्रेणी हटाना है।

क्रैशिंग "पूर्ववत करें" बग पर एक नोट

जैसा कि टिप्पणियों में उल्लेख किया गया है, UITextField साथ एक बग है जो एक दुर्घटना का कारण बन सकती है।

यदि आप फ़ील्ड में पेस्ट करते हैं, लेकिन पेस्ट को आपके सत्यापन कार्यान्वयन से रोका जाता है, तो पेस्ट ऑपरेशन अभी भी एप्लिकेशन के पूर्ववत बफर में दर्ज किया जाता है। यदि आप एक पूर्ववत (डिवाइस को हिलाकर और पूर्ववत की पुष्टि करके) को आग 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
    }

आशा है कि यह आपके लिए सहायक होगा।


ज़मरिन के लिए:

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

निम्न कोड बीमार के उत्तर के समान है लेकिन सही ढंग से कॉपी-पेस्ट ऑपरेशंस को संभालता है। यदि आप सीमा से अधिक लंबा टेक्स्ट पेस्ट करने का प्रयास करते हैं, तो निम्न कोड पेस्ट ऑपरेशन को पूरी तरह से इंकार करने की बजाय सीमा को फिट करने के लिए टेक्स्ट को छोटा कर देगा।

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

पाठ बदलने पर एक अधिसूचना स्थापित करने का सबसे अच्छा तरीका होगा। आपके व्यू कंट्रोलर विधि के आपके -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];

मैंने this UITextFieldLimit उपclass बनाया है:

  • एकाधिक टेक्स्टफील्ड समर्थित हैं
  • पाठ की लंबाई सीमा निर्धारित करें
  • पेस्ट रोकथाम
  • टेक्स्टफील्ड के अंदर बाएं अक्षरों का एक लेबल प्रदर्शित करता है, जब आप संपादन बंद करते हैं तो छुपाएं।
  • जब कोई अक्षर नहीं छोड़ा गया एनीमेशन हिलाएं।

इस गिटहब भंडार से UITextFieldLimit.h और UITextFieldLimit.m को पकड़ें:

this

और परीक्षण शुरू करते हैं!

अपने स्टोरीबोर्ड द्वारा निर्मित UITextField को चिह्नित करें और पहचान निरीक्षक का उपयोग करके इसे मेरे सबक्लास में लिंक करें:

फिर आप इसे आईबीओटलेट से जोड़ सकते हैं और सीमा निर्धारित कर सकते हैं (डिफ़ॉल्ट 10 है)।

आपकी ViewController.h फ़ाइल में निम्न होना चाहिए: (यदि आप सेटिंग को संशोधित नहीं करना चाहते हैं, तो सीमा की तरह)

#import "UITextFieldLimit.h"

/.../

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

आपकी ViewController.m फ़ाइल को @synthesize textFieldLimit को @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.
}

उम्मीद है कि कक्षा आपको मदद करेगी। सौभाग्य!


मैंने एक STATextField , STATextField को खोल STATextField , जो इसकी कार्यक्षमता (और बहुत कुछ) को इसके maxCharacterLength संपत्ति के साथ प्रदान करता है।


मैंने पैड का उपयोग करते समय स्विफ्ट में 8 वर्ण सीमा के लिए ऐसा किया था।

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

मुझे स्ट्रिंग के लिए परीक्षण करना था! = "" डिलीट बटन को संख्या पैड पर काम करने की इजाजत देने के लिए, अन्यथा यह अधिकतम क्षेत्र तक पहुंचने के बाद टेक्स्ट फ़ील्ड में अक्षरों को हटाने की अनुमति नहीं देगा।


यह वर्णों की संख्या को सीमित करता है, लेकिन यह भी सुनिश्चित करता है कि आप अधिकतम सीमा तक फ़ील्ड में पेस्ट कर सकते हैं।

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

स्विफ्ट 3 संस्करण // ***** यह स्विफ्ट 2.x के साथ काम नहीं करेगा! ***** //

सबसे पहले एक नई स्विफ्ट फ़ाइल बनाएं: 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
   }
}

और फिर जब आप कोई टेक्स्टफ़िल्ल्ड चुनते हैं तो आप स्टोरीबोर्ड में एक नया फ़ील्ड (अधिकतम लंबाई) देखेंगे

यदि आपके पास अभी भी अधिक प्रश्न हैं तो इस लिंक को देखें: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields-maximum-length-visual-studio-style/


स्विफ्ट में अधिकतम लंबाई निर्धारित करने के लिए सामान्य समाधान है । IBInspectable द्वारा आप एक्सकोड विशेषता निरीक्षक में नई विशेषता जोड़ सकते हैं।

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
    }

}

स्विफ्ट 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

अब टेक्स्टफील्ड को चाहिएChangeCharactersInRange विधि और निम्न की तरह उपयोग करें।

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. यह विशेष टेक्स्टफील्ड के लिए स्वीकृत कुंजी के प्रकार सेट करेगा।

प्रकार ...

//Olylyharacters // // केवल अक्षरों को स्वीकार करता है।

इसमें अभियंता // // वर्णों के संयोजन को स्वीकार करता है

//NotContainsCharacters // // पात्रों को स्वीकार नहीं करेगा

उम्मीद है कि यह मदद की .... धन्यवाद ..


स्विफ्ट 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
}






uitextfield