अधिकतम लंबाई UITextField


120

जब मैंने कोशिश की है तो आप कैसे अधिकतम वर्ण सेट कर सकते हैं जो स्विफ्ट का उपयोग करके UITextField में दर्ज किए जा सकते हैं? , मैंने देखा कि यदि मैं सभी 10 वर्णों का उपयोग करता हूं, तो मैं चरित्र को मिटा भी नहीं सकता।

केवल एक चीज जो मैं कर रहा हूं वह ऑपरेशन को रद्द करना है (सभी वर्णों को एक साथ हटाएं)।

क्या कोई जानता है कि कीबोर्ड को कैसे ब्लॉक नहीं किया जाए (ताकि मैं अन्य अक्षरों / प्रतीकों / संख्याओं को जोड़ न सकूं, लेकिन मैं बैकस्पेस का उपयोग कर सकता हूं)

जवाबों:


294

स्विफ्ट 5 और आईओएस 12 के साथ, प्रोटोकॉल textField(_:shouldChangeCharactersIn:replacementString:)का हिस्सा है कि विधि के निम्नलिखित कार्यान्वयन का प्रयास करें UITextFieldDelegate:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText) else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count
    return count <= 10
}
  • इस कोड का सबसे महत्वपूर्ण हिस्सा रूपांतरण range( NSRange) से rangeOfTextToReplace( Range<String.Index>) है। यह रूपांतरण महत्वपूर्ण क्यों है, यह समझने के लिए इस वीडियो ट्यूटोरियल को देखें ।
  • इस कोड को ठीक से काम करने के लिए, आपको textField'का smartInsertDeleteTypeमान ' भी निर्धारित करना चाहिए UITextSmartInsertDeleteType.no। यह पेस्ट ऑपरेशन करते समय (अवांछित) अतिरिक्त स्थान के संभावित सम्मिलन को रोक देगा।

नीचे पूर्ण नमूना कोड दिखाता textField(_:shouldChangeCharactersIn:replacementString:)है UIViewController:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let textFieldText = textField.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= 10
    }

}

क्या आप इस कोड को अपने व्यू कंट्रोलर क्लास में डाल सकते हैं? या मुझे कनेक्शन करने हैं?
इसहाक वासरमैन

अगर किसी को कुछ शर्त रखने की जरूरत हो..तो आप ऐसा कर सकते हैं ..। if (textField .isEqual (mobileNumberTextfield)) {guard let टेक्स्ट = textField.text अन्यथा {return true} दें newLength = text.characters.count + string.characters.count - सीमा .length वापसी newLength <= limitLength; } सच लौटना;
नरसिम्हा नल्लमसेट्टी

5
स्विफ्ट 4 के लिए, text.characters.countपदावनत उपयोग हैtext.count
मोहम्मद सलाह

47

मैं इसे इस तरह से करता हूं:

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    if (countElements(textField.text!) > maxLength) {
        textField.deleteBackward()
    }
}

कोड मेरे लिए काम करता है। लेकिन मैं स्टोरीबोर्ड के साथ काम करता हूं। स्टोरीबोर्ड में मैं संपादन बदले पर दृश्य नियंत्रक में पाठ क्षेत्र के लिए एक कार्रवाई जोड़ता हूं ।


1
Swift 2 में गिनती करने के लिए countElements बदल दिए गए हैं, लेकिन मेरे लिए यह काम करना बदल रहा है!
जॉन

1
धन्यवाद, आप अब उपयोग कर सकते हैं textField.text? .Characters.count क्योंकि countElements बदल दिया गया है।
आर।

1
Tks, इस बदलाव के साथ बहुत अच्छा काम किया: Swift 2 में countElements (textField.text!) है: textField.text? .Characters.count
kha

33

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

15

@Martin उत्तर से अधिक विवरण जोड़ें

// linked your button here
@IBAction func mobileTFChanged(sender: AnyObject) {
    checkMaxLength(sender as! UITextField, maxLength: 10)
}

// linked your button here
@IBAction func citizenTFChanged(sender: AnyObject) {
    checkMaxLength(sender as! UITextField, maxLength: 13)
}

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    // swift 1.0
    //if (count(textField.text!) > maxLength) {
    //    textField.deleteBackward()
    //}
    // swift 2.0
    if (textField.text!.characters.count > maxLength) {
        textField.deleteBackward()
    }
}

1
गिनती (textField.text!) एक त्रुटि देती है। आपको textField.text! .Characters.count
Regis St-Gelais

1
धन्यवाद @ RegisSt-Gelais, यह पहले से ही एक पुराना जवाब है, मैंने इसे अभी अपडेट किया है
S.S. A.Suk

11

स्विफ्ट 4 में

पाठ क्षेत्र के लिए 10 वर्ण सीमा और हटाने की अनुमति (बैकस्पेस)

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if textField ==  userNameFTF{
            let char = string.cString(using: String.Encoding.utf8)
            let isBackSpace = strcmp(char, "\\b")
            if isBackSpace == -92 {
                return true
            }
            return textField.text!.count <= 9
        }
        return true
    }


8

स्विफ्ट 3

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

            let nsString = NSString(string: textField.text!)
            let newText = nsString.replacingCharacters(in: range, with: string)
            return  newText.characters.count <= limitCount
    }

8

आप UITextField का विस्तार कर सकते हैं और @IBInspectableइसे संभालने के लिए एक वस्तु जोड़ सकते हैं :

स्विफ्ट 5

import UIKit
private var __maxLengths = [UITextField: Int]()
extension UITextField {
    @IBInspectable var maxLength: Int {
        get {
            guard let l = __maxLengths[self] else {
                return 150 // (global default-limit. or just, Int.max)
            }
            return l
        }
        set {
            __maxLengths[self] = newValue
            addTarget(self, action: #selector(fix), for: .editingChanged)
        }
    }
    @objc func fix(textField: UITextField) {
        if let t = textField.text {
            textField.text = String(t.prefix(maxLength))
        }
    }
}

और उसके बाद इसे विशेषता निरीक्षक पर परिभाषित करें

यहाँ छवि विवरण दर्ज करें

स्विफ्ट 4 मूल उत्तर देखें


2
अच्छा, साफ कोड। लेकिन किसी कारण से यह अजीब संपादन व्यवहार का कारण बनता है जब आप इमोजीस का उपयोग करते हैं। हर बार जब आप संपादित करने का प्रयास करते हैं, तो कर्सर पंक्ति के अंत में रुक जाता है।
फॉनटेन जुड

5

यदि आप अंतिम पत्र को अधिलेखित करना चाहते हैं:

let maxLength = 10

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

    if range.location > maxLength - 1 {
        textField.text?.removeLast()
    }

    return true
}

4

मैंने एक समाधान का उपयोग करके पोस्ट किया IBInspectable, जिससे आप इंटरफ़ेस बिल्डर या प्रोग्रामेटिक रूप से अधिकतम लंबाई मान बदल सकते हैं। यहां इसकी जांच कीजिए


3

आप स्विफ्ट 5 या स्विफ्ट 4 का उपयोग कर सकते हैं जैसे कि छवि बिल्लो की तरह दिखती है यहाँ छवि विवरण दर्ज करें

  1. दृश्य नियंत्रक में textField जोड़ें
  2. टेक्स्ट को ViewController से कनेक्ट करें
  3. ViewController में कोड जोड़ें

     class ViewController: UIViewController , UITextFieldDelegate {
    
      @IBOutlet weak var txtName: UITextField!
    
      var maxLen:Int = 8;
    
     override func viewDidLoad() {
        super.viewDidLoad()
    
        txtName.delegate = self
       }
    
     func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
         if(textField == txtName){
            let currentText = textField.text! + string
            return currentText.count <= maxLen
         }
    
         return true;
       }
    }

आप फुल सोर्स फॉर्म GitHub: https://github.com/enamul95/TextFieldMaxLen डाउनलोड कर सकते हैं


1

इस पोस्ट में UITextField के लिए पूर्ववत बग से सावधान रहें: UITextField की अधिकतम वर्ण लंबाई निर्धारित करें

यहाँ है कि आप इसे तेजी से कैसे ठीक करते हैं

if(range.length + range.location > count(textField.text)) {
        return false;
}

यदि आप इमोजी और इस तरह के उपयोग का समर्थन करना चाहते हैं: यदि (range.length + range.location> count (textField.text.utf16)) {झूठा; }
एलेक्सडी

1
Here is my version of code. Hope it helps!

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        let invalidCharacters = NSCharacterSet(charactersInString: "0123456789").invertedSet

        if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex))
        {
            return false
        }

        if (count(textField.text) > 10  && range.length == 0)
        {
            self.view.makeToast(message: "Amount entry is limited to ten digits", duration: 0.5, position: HRToastPositionCenter)
            return false
        }
        else
        {

        }

        return true
    }

1
मुझे टोस्ट
उविवि

1

मैं अपने एक ऐप में इस प्रोटोकॉल / एक्सटेंशन का उपयोग कर रहा हूं, और यह थोड़ा अधिक पठनीय है। मुझे पसंद है कि यह कैसे बैकस्पेस को पहचानता है और स्पष्ट रूप से आपको बताता है कि एक चरित्र एक बैकस्पेस है।

विचार करने के लिए कुछ बातें:

1. जो भी लागू करता है इस प्रोटोकॉल विस्तार के लिए एक चरित्र सीमा निर्दिष्ट करने की आवश्यकता है। यह आमतौर पर आपका ViewController होने जा रहा है, लेकिन आप एक सीमित संपत्ति के रूप में चरित्र सीमा को लागू कर सकते हैं और कुछ और लौटा सकते हैं, उदाहरण के लिए आपके किसी मॉडल पर एक चरित्र सीमा।

2. आपको इस विधि को अपने पाठ क्षेत्र के कंधोंच्रेचरर्स इनरेंज प्रतिनिधि विधि के अंदर कॉल करना होगा। अन्यथा आप असत्य को वापस करके पाठ प्रविष्टि को ब्लॉक करने में सक्षम नहीं होंगे, आदि।

3. आप संभवतः बैकस्पेस वर्णों के माध्यम से अनुमति देना चाहेंगे। इसलिए मैंने बैकस्पेस का पता लगाने के लिए अतिरिक्त फ़ंक्शन को जोड़ा। आपकी चेंजचेकच्रेकर्स विधि इसके लिए जाँच कर सकती है और 'सत्य' को जल्दी लौटा सकती है ताकि आप हमेशा बैकस्पेस की अनुमति दें।

protocol TextEntryCharacterLimited{
    var characterLimit:Int { get } 
}

extension TextEntryCharacterLimited{

    func charactersInTextField(textField:UITextField, willNotExceedCharacterLimitWithReplacementString string:String, range:NSRange) -> Bool{

        let startingLength = textField.text?.characters.count ?? 0
        let lengthToAdd = string.characters.count
        let lengthToReplace = range.length

        let newLength = startingLength + lengthToAdd - lengthToReplace

        return newLength <= characterLimit

    }

    func stringIsBackspaceWith(string:String, inRange range:NSRange) -> Bool{
        if range.length == 1 && string.characters.count == 0 { return true }
        return false
    }

}

यदि आप में से कोई भी रुचि रखते हैं, तो मेरे पास एक गितुब रेपो है जहां मैंने इस चरित्र सीमा व्यवहार में से कुछ लिया है और एक आईओएस ढांचे में डाल दिया है। एक प्रोटोकॉल है जिसे आप ट्विटर जैसी कैरेक्टर लिमिट डिसप्ले प्राप्त करने के लिए कार्यान्वित कर सकते हैं जो आपको दिखाता है कि आप कैरेक्टर लिमिट से कितनी दूर जा चुके हैं।

जीथब पर कैरेक्टरलाइज्ड फ्रेमवर्क


1

चूंकि प्रतिनिधि 1-से-1 संबंध हैं और मैं इसे अन्य कारणों से कहीं और उपयोग करना चाहता हूं, इसलिए मुझे टेक्स्टफील्ड की लंबाई को इस कोड को उनके सेटअप में जोड़ना प्रतिबंधित करना पसंद है:

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        setup()
    }

    required override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    func setup() {

        // your setup...

        setMaxLength()
    }

    let maxLength = 10

    private func setMaxLength() {
            addTarget(self, action: #selector(textfieldChanged(_:)), for: UIControlEvents.editingChanged)
        }

        @objc private func textfieldChanged(_ textField: UITextField) {
            guard let text = text else { return }
            let trimmed = text.characters.prefix(maxLength)
            self.text = String(trimmed)

        }

0

इस का उपयोग कर Im;

सीमा 4 चेर

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

        if let txt = textField.text {
            let currentText = txt + string
            if currentText.count > 3 {
                return false
            }
            return true
        }
        return true
    }

0

स्विफ्ट 5

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let MAX_LENGTH = 4
        let updatedString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        return updatedString.count <= MAX_LENGTH
    }

-3

आपको यह जांचने की आवश्यकता है कि मौजूदा स्ट्रिंग प्लस इनपुट 10 से अधिक है या नहीं।

   func textField(textField: UITextField!,shouldChangeCharactersInRange range: NSRange,    replacementString string: String!) -> Bool {
      NSUInteger newLength = textField.text.length + string.length - range.length;
      return !(newLength > 10)
   }

5
आपका कोड गलत है। 1. आपको स्विफ्ट (नहीं NSUInteger) में लेट या वर के साथ अपने कंटीन्यू या वेरिएबल को घोषित करना होगा। 2. textField.text और स्ट्रिंग स्ट्रिंग के प्रकार हैं। लंबाई स्विफ्ट में स्ट्रिंग की एक संपत्ति / विधि नहीं है।
इमानौ पेटिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.