সর্বোচ্চ দৈর্ঘ্য ইউআইটিেক্সটফিল্ড


120

যখন আমি চেষ্টা করেছি আপনি কীভাবে সর্বাধিক সংখ্যক অক্ষর সেট করতে পারেন যা সুইফট ব্যবহার করে কোনও ইউআইটিেক্সটফিল্ডে প্রবেশ করা যায়? , আমি দেখেছি যে আমি যদি সমস্ত 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
    }

}

আপনি কি নিজের ভিউ নিয়ামক শ্রেণিতে এই কোডটি রেখেছেন? নাকি আমার সংযোগ করতে হবে?
আইজাক ওয়াসারম্যান

কারও যদি কিছু শর্ত রাখা দরকার..আপনি এটি করতে পারেন ..। যদি (টেক্সটফিল্ড .isEqual (মোবাইলনম্বারটেক্সটিল্ড)) {প্রহরী যাক পাঠ্য = টেক্সটফিল্ড.টেক্সট অন্য true সত্য ফিরে আসুন} আসুন newLength = text.characters.count + string.characters.count - পরিসীমা.পরেতা ফিরে আসুন নতুন দৈর্ঘ্য <= সীমাবদ্ধতা; সত্য প্রত্যাবর্তন;
নরসিংহ নল্লামেস্টেটি

5
সুইফ্ট 4 এর জন্য, text.characters.countঅবচিত ব্যবহার করা হয়েছেtext.count
মোহাম্মদ সালাহ

47

আমি এটি এইভাবে করি:

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

কোডটি আমার পক্ষে কাজ করে। তবে আমি স্টোরিবোর্ড নিয়ে কাজ করি। স্টোরিবোর্ডে আমি সম্পাদনার ক্ষেত্রে ভিউ কন্ট্রোলারটিতে পাঠ্য ক্ষেত্রের জন্য একটি ক্রিয়া যুক্ত করি ।


1
কাউন্টের উপাদানগুলি সুইফট 2 এ গণনাতে পরিবর্তন করা হয়েছে, তবে এটি আমার পক্ষে কার্যকর!
জন

1
ধন্যবাদ, আপনি এখন টেক্সটফিল্ড.টেক্সট ব্যবহার করতে পারেন?
অনিবল আর

1
Tks, এটা এই পরিবর্তনের সঙ্গে কাজ করে মহান: countElements (textField.text!) সুইফট 2 রয়েছে:? TextField.text .characters.count

32

সুইফট 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

@ মার্টিন উত্তর থেকে আরও বিশদ যুক্ত করুন

// 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
গণনা (টেক্সটফিল্ড.টেক্সট!) একটি ত্রুটি দেয়। আপনাকে অবশ্যই টেক্সটফিল্ড.টেক্সট! .Characters.count
Regis St-Gelais

1
ধন্যবাদ @ রেজিস্টস্ট-জেলাইস, এটি ইতিমধ্যে একটি পুরানো উত্তর, আমি এখনই এটি আপডেট করেছি
সুরুট এ.সুক

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

আপনি ইউআইটিেক্সটফিল্ড প্রসারিত করতে এবং @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. ভিউ কন্ট্রোলারে টেক্সটফিল্ড যুক্ত করুন
  2. ভিউকন্ট্রোলারের সাথে পাঠ্যের সাথে সংযুক্ত করুন
  3. ভিউকন্ট্রোলারটিতে কোড যুক্ত করুন

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

আপনি সম্পূর্ণ উত্স ফর্মটি গিটহাব ডাউনলোড করতে পারেন: https://github.com/enamul95/TextFieldMaxLen


1

এই পোস্টে উল্লিখিত ইউআইটিেক্সটফিল্ডের পূর্বাবস্থায় ফিরে আসা বাগ থেকে সাবধান থাকুন: একটি ইউআইটিেক্সটফিল্ডের সর্বাধিক অক্ষরের দৈর্ঘ্য নির্ধারণ করুন

আপনি কিভাবে তাড়াতাড়ি এটি ঠিক করুন

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

আপনি যদি ইমোজি এবং এই জাতীয় ব্যবহারকে সমর্থন করতে চান: যদি (পরিধি. দৈর্ঘ্য + পরিসীমা.লোকেশন> গণনা (টেক্সটফিল্ড.টেক্সট.টফ 16)) false মিথ্যা প্রত্যাবর্তন করুন; }
অ্যালেক্স

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. এই প্রোটোকল এক্সটেনশানটি যা কিছু প্রয়োগ করে তার জন্য একটি চরিত্রের সীমা নির্দিষ্ট করা দরকার। এটি সাধারণত আপনার ভিউকন্ট্রোলার হতে চলেছে, তবে আপনি একটি গণিত সম্পত্তি হিসাবে চরিত্র সীমাটি প্রয়োগ করতে এবং অন্য কোনও কিছু ফিরিয়ে আনতে পারেন, উদাহরণস্বরূপ আপনার মডেলগুলির একটিতে চরিত্রের সীমা।

২. আপনার পাঠ্য ক্ষেত্রের shouldgeCharactersInRange প্রতিনিধি পদ্ধতির অভ্যন্তরে আপনাকে এই পদ্ধতিটি কল করতে হবে। অন্যথায় আপনি মিথ্যা ইত্যাদি ফিরিয়ে পাঠ্য এন্ট্রি ব্লক করতে পারবেন না etc.

৩. আপনি সম্ভবত ব্যাকস্পেস অক্ষরের মাধ্যমে অনুমতি দিতে চাইবেন। এজন্য আমি ব্যাকস্পেসগুলি সনাক্ত করতে অতিরিক্ত ফাংশন যুক্ত করেছি। আপনার shouldChageCharacters পদ্ধতিটি এটির জন্য পরীক্ষা করতে পারে এবং তাড়াতাড়ি 'সত্য' ফিরতে পারে যাতে আপনি সর্বদা ব্যাকস্পেসগুলিকে অনুমতি দেন।

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

আমি এটি ব্যবহার করছি;

সীমা 3 চর

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
আপনার কোডটি ভুল। ১. আপনাকে আপনার ধ্রুবক বা পরিবর্তনশীলটি সুইফটে (এনএসইউআইঞ্জার নয়) এর সাথে লেট বা ভেরিয়েবলের সাথে ঘোষণা করতে হবে। টেক্সটফিল্ড.টেক্সট এবং স্ট্রিং স্ট্রিং টাইপ হয়। দৈর্ঘ্য কোনও সুইট-এ স্ট্রিংয়ের সম্পত্তি / পদ্ধতি নয়।
ইমানু পেটিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.