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


474

আমি UITextFieldযখন লোড আপ করি তখন আমি আইফোন এসডিকে একটিতে সর্বাধিক পরিমাণের অক্ষর কীভাবে সেট করতে পারি UIView?


এই অবিশ্বাস্যভাবে পুরানো উত্তরটি খুব পুরানো - উত্তরটি এখন তুচ্ছ: স্ট্যাকওভারফ্লো.com
38306929

উত্তর:


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
}

পাঠ্য ক্ষেত্র পরিবর্তনের আগে, ইউআইটিেক্সটফিল্ড প্রতিনিধিটিকে জিজ্ঞাসা করে যে নির্দিষ্ট পাঠ্যটি পরিবর্তন করা উচিত । পাঠ্য ক্ষেত্রটি এই মুহুর্তে পরিবর্তিত হয়নি, সুতরাং এটির বর্তমান দৈর্ঘ্য এবং আমরা সন্নিবেশ করানো স্ট্রিংয়ের দৈর্ঘ্য (কপিরাইটযুক্ত টেক্সট পেস্ট করার মাধ্যমে বা কীবোর্ডটি ব্যবহার করে একটি অক্ষর টাইপ করার মাধ্যমে) ব্যাপ্তি বিয়োগের দৈর্ঘ্যটি বিয়োগ করবে। যদি এই মানটি খুব দীর্ঘ হয় (এই উদাহরণে 25 টিরও বেশি অক্ষর), ফিরে আসুনNO পরিবর্তনটি নিষিদ্ধ করতে আসুন।

পাঠ্য ক্ষেত্রের শেষে একটি একক অক্ষরে টাইপ করার সময়, range.locationবর্তমান ক্ষেত্রের দৈর্ঘ্য range.lengthহবে এবং 0 হবে কারণ আমরা কোনও কিছুই প্রতিস্থাপন / মোছা করছি না। একটি পাঠ্য ক্ষেত্রের মাঝখানে সন্নিবেশ করানোর অর্থ অন্যরকম range.location, এবং একাধিক অক্ষর পেস্ট করার অর্থ stringএর মধ্যে একাধিক অক্ষর থাকে।

একক অক্ষর মুছে ফেলা বা একাধিক অক্ষর কাটা একটি দ্বারা নির্দিষ্ট করা হয় 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
যদি (টেক্সটফিল্ড == _ssn) {with এবং রিটার্ন হ্যাঁ যোগ করে those 2 টি লাইনের চারপাশে সমাধান খুঁজে পেয়েছেন; পদ্ধতির শেষে, যা অন্য সমস্ত ইউআইটিেক্সটফিল্ডকে কোনও বাধা ছাড়াই পাঠ্য গ্রহণ করতে দেয় allow নিফটি!
কাইল Clegg

55
উত্তম উত্তর, তবে টেরিনারি অপারেটর অতিমাত্রায়; আপনি ঠিক রাখতে পারেনreturn newLength <= 25;
জুই

2
আপনি যদি চান যে পাঠ্যটি পাঠ্যক্ষেত্রের ফ্রেমের উপরে ছড়িয়ে না পড়ে; সমস্ত অক্ষর একই প্রস্থ নয়, তাই না?
মোরক্রোম

2
@ বাচারি উল্লেখ করার সাথে সাথে সত্যিই একটি পূর্ববর্তী ত্রুটি রয়েছে - UITextFieldআইপ্যাড আইওএস 8.1 এর সাথে পরীক্ষিত । (মন্তব্য করতে +1)। এটি শীর্ষ রেটিং উত্তর হিসাবে লেখক এই সম্পর্কে কিছু যুক্ত করতে চান? আমি একটি সম্পাদনা করতে পেরে খুশি, তবে আমার নিয়মিত প্রত্যাখ্যাত বলে মনে হচ্ছে! :-)
বেনজহান

8
@ বেরি ইন সুইফটে, পূর্বাবস্থায় ফিরে আসা মামলার চেক ইমোজি প্রবেশের বিষয়টি ভঙ্গ করেছে। পরিসরে অবজেক্ট / ইউিকিত রিপোর্টিংয়ের সাথে (বনাম সুইফ্টের স্ট্রিংয়ের গণনার প্রকরণ) মিলানোর জন্য গণনা (টেক্সটফিল্ড.টেক্সট) আসলে গণনা করা উচিত নয় (টেক্সটফিল্ড.টেক্সট.উটফ 16)?
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
    }
}

সম্পাদনা: মেমরি ফাঁস ইস্যু স্থির।

এখানে চিত্র বর্ণনা লিখুন


দুর্দান্ত ধারণা ফ্রুও! আমি আমার উত্তরে এর প্রসারিত করে ম্যাক্সেল দৈর্ঘ্য ট্রিমিংয়ের স্ট্রিং এক্সটেনশনে স্থানান্তরিত করেছি যাতে এটি ইউআইটিেক্সটভিউ দৃষ্টান্তের মতো জিনিসগুলির জন্যও ব্যবহার করা যায় এবং কোনও ইউআইটিেক্সটফিল্ড এক্সটেনশনে এই স্ট্রিং এক্সটেনশনের সুবিধা নিতে কোনও সুবিধা ফাংশন যুক্ত করতে পারে।
স্কট গার্ডনার

1
এই বিশ্বব্যাপী পরিবর্তনশীল সমস্ত পাঠ্যদর্শন (যা মূল পর্যবেক্ষণে তত্ত্বাবধায়নের রেফারেন্স দেয়) ধরে রেখে মেমরি ফাঁস তৈরি করে না
Ixx

3
@ আইএক্সএক্স আমি আপনাকে + সুইফট 3 নির্দেশিত মেমরি ফাঁস ইস্যুটি ঠিক করার জন্য সম্পাদনা করেছি Thanks ধন্যবাদ
8:37

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
লোকেরা কোনও বা হ্যাঁ ফিরিয়ে দেওয়ার জন্য যদি বিবৃতি দিয়ে থাকে তবে তাদের কী হবে? এটি ব্যবহার করে দেখুন: রিটার্ন করুন! (টেক্সটফিল্ড.টেক্সট.লেন্থ> = MAX_LENGTH && range.length == 0);
ম্যাট পার্কিনস

বা এটিreturn textField.text.length < MAX_LENGTH || range.length != 0;
igrek

22

আগস্টের উত্তরটি সম্পূর্ণ করার জন্য, প্রস্তাবিত কার্যটির একটি সম্ভাব্য বাস্তবায়ন ( ইউআইটিেক্সটফিল্ডের প্রতিনিধি দেখুন )।

আমি আধিপত্য কোড পরীক্ষা করিনি , তবে ব্যবহারকারীর সীমাতে পৌঁছে গেলে আমার আটকা পড়ে না, এবং এটি একটি নতুন স্ট্রিংয়ের সাথে সামঞ্জস্যপূর্ণ যা আসে ছোট বা সমান কোডটি প্রতিস্থাপন করে।

-(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এটি করতে পারবেন না - কোনও সর্বোচ্চ দৈর্ঘ্যের কোনও বৈশিষ্ট্য নেই, তবে আপনি UITextField'sপ্রতিনিধি সেট করতে পারেন , তারপরে ব্যবহার করুন:

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

5
আমি সম্মতি জানাই, এটি এগিয়ে যাওয়ার সবচেয়ে ভাল উপায় তবে এটি কিছুটা হ্যাক থেকে যায়। অ্যাপলের কাছে একটি বাগ রিপোর্ট জমা দিন যাতে আপনি পাঠ্যের দৈর্ঘ্যের জন্য কোনও সম্পত্তি দেখতে চান। আমি অবশ্যই এতে আগ্রহী।
এভোক্যাড

5
@ ওয়াওকেড, এটি কোনও হ্যাক নয়: এটি এমন একটি উদাহরণ যেখানে আপনাকে অ্যাপল আপনার জন্য করা উচিত বুনিয়াদি কাঠামো কোড করতে হবে। আইওএস এসডিকে এর অনেকগুলি উদাহরণ রয়েছে।
ড্যান রোজনস্টার্ক

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 = [মাই টেক্সটফিল্ড.টেক্সট সাবস্ট্রিংটওইন্ডেক্স: সীমা];
লুক

11

আমি এই ইউআইটিেক্সটফিল্ড লিমিট সাবক্লাসটি তৈরি করেছি :

  • একাধিক পাঠ্যক্ষেত্র সমর্থিত
  • পাঠ্যের দৈর্ঘ্যের সীমা নির্ধারণ করুন
  • আটকানো প্রতিরোধ
  • পাঠ্যক্ষেত্রের অভ্যন্তরে বাম অক্ষরের একটি লেবেল প্রদর্শন করে, আপনি সম্পাদনা বন্ধ করলে লুকানো হয়ে যান।
  • কোনও অক্ষর না থাকলে অ্যানিমেশন কাঁপুন।

দখল UITextFieldLimit.hএবং UITextFieldLimit.mএই GitHub সংগ্রহস্থল থেকে:

https://github.com/JonathanGurebo/UITextFieldLimit

এবং পরীক্ষা শুরু!

আপনার স্টোরিবোর্ডে তৈরি ইউআইটিেক্সটফিল্ডটি চিহ্নিত করুন এবং সনাক্তকরণ পরিদর্শকটি ব্যবহার করে এটি আমার সাবক্লাসে লিঙ্ক করুন:

পরিচয় পরিদর্শক

তারপরে আপনি এটিকে একটি আইবিউলেটলে লিঙ্ক করতে পারেন এবং সীমাটি সেট করতে পারেন (ডিফল্টটি 10)।


আপনার ভিউকন্ট্রোল.আর ফাইলটিতে এমন হওয়া উচিত: (আপনি যদি সীমাটির মতো সেটিংটি পরিবর্তন করতে চান না)

#import "UITextFieldLimit.h"

/.../

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

আপনার ভিউকন্ট্রোলআরএম ফাইলটি করা উচিত @synthesize textFieldLimit


আপনার ভিউকন্ট্রোলআরএম ফাইলটিতে পাঠ্যের দৈর্ঘ্যের সীমাটি সেট করুন:

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

আশা করি শ্রেণি আপনাকে সহায়তা করবে। শুভকামনা!


চরিত্রের সীমাবদ্ধতার সামান্য প্রয়োজনের জন্য, আমি মনে করি আপনার ক্লাস যুক্ত করা কেবলমাত্র ওভারকিল হবে।
আধিপত্য

তবুও চেষ্টা প্রশংসিত।
রেপার

11

সমস্যাটি সমাধান করার জন্য এটি পর্যাপ্ত হওয়া উচিত (আপনার সীমা দ্বারা 4 টি প্রতিস্থাপন করুন)। কেবল আইবিতে প্রতিনিধি যুক্ত করার বিষয়টি নিশ্চিত করুন।

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

9

একটি UITextFieldএবং সর্বাধিক অক্ষরের দৈর্ঘ্য সেট করতে নীচে এক্সটেনশনটি ব্যবহার করুন UITextView

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

আপনি নীচে সীমা নির্ধারণ করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন


এখন পর্যন্ত সর্বোত্তম উত্তর ,,, অনেক পাঠ্যক্ষেত্রের জন্য যখন বিভিন্ন দৈর্ঘ্যের প্রয়োজন হয় তখন প্রচুর সমাধানের জন্য ধন্যবাদ
কার্লোস নোরেনা

পাঠ্যক্ষেত্র এবং পাঠ্যদর্শন নিয়ন্ত্রণ অক্ষর ইনপুট সীমা জন্য সত্যিই দুর্দান্ত সমাধান। এটি ডেভেলপারদের পক্ষে কোড লাইন এবং সময় সাশ্রয় করে ... :)
সন্দীপ প্যাটেল - এসএম

আমি যে অন্যান্য সমাধান পেয়েছি তার চেয়ে এটি আরও ভাল কাজ করে। উদাহরণস্বরূপ, যদি আপনার পাঠ্যক্ষেত্রের ইমোজি থাকে তবে আমি খুঁজে পেয়েছি এমন অন্যান্য এক্সটেনশানগুলি সম্পাদনার সময় লাইনের শেষ দিকে যেতে হবে। কিন্তু আপনার কোড এটি করে না। ধন্যবাদ!
ফোনটেন জুড

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

সুইফট 3 সংস্করণ // ***** এটি সুইফট 2.x এর সাথে কাজ করবে না! ***** //

প্রথমে একটি নতুন সুইফ্ট ফাইল তৈরি করুন: টেক্সটফিল্ডম্যাক্সেলেন্থ.সুইফ্ট এবং তারপরে নীচের কোডটি যুক্ত করুন:

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 দৈর্ঘ্যের ভিজুয়াল-স্টুডিওতে-শৈলী /


সতর্কতা, এই বিশ্বব্যাপী পরিবর্তনশীল সমস্ত পাঠ্যদর্শনগুলির রেফারেন্স ধরে মেমরি ফাঁস তৈরি করে।
frouo

6

ইন্টারফেস বিল্ডার ব্যবহার করে আপনি লিঙ্ক করতে পারেন এবং আপনার যে কোনও ফাংশনে "সম্পাদনা পরিবর্তিত" এর ইভেন্টটি পেতে পারেন। এখন সেখানে আপনি দৈর্ঘ্যের জন্য পরীক্ষা করতে পারেন

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

নেই জেনেরিক সমাধান সুইফট মধ্যে সর্বোচ্চ দৈর্ঘ্য সেট করার জন্য। আইবিআই স্পেসটেবল দ্বারা আপনি এক্সকোড অ্যাট্রিবিউট ইন্সপেক্টরটিতে নতুন অ্যাট্রিবিউট যুক্ত করতে পারেন।এখানে চিত্র বর্ণনা লিখুন

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
    }

}

পরিষ্কার এবং নিখুঁত সমাধান
এডুয়ার্ডো

বৈশ্বিক ক্ষেত্রে একটি ইউআইটিেক্সটফিল্ড ধরে রাখা ইউআইভিউকন্ট্রোলার বরখাস্ত হওয়ার পরেও এগুলিকে স্মৃতিতে ধরে রাখবে। এটি একটি স্মৃতি ফাঁস। এই পদ্ধতিটি ব্যবহার করবেন না।
গুণহান

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
}


পাঠ্যটি শূন্য রয়েছে কিনা তা পরীক্ষা করে দেখুন, আপনি চাইলে @oddRaven
শান ইয়ে

3

সুইফট ২.০ +

সবার আগে এই প্রক্রিয়াটির জন্য একটি শ্রেণি তৈরি করুন। একে স্ট্রিংভালিডেটর.সুইফ্ট বলি।

তারপরে নীচের কোডটি কেবল তার ভিতরে পেস্ট করুন।

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
}

}

এখন ক্লাস বাঁচাও .....

ব্যবহারের ..

এখন আপনার ভিউকন্ট্রোলআরউইউফ্ট ক্লাসে যান এবং আপনার পাঠ্যক্ষেত্রের আউটলেটগুলি হিসাবে করুন ..

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

এখন টেক্সটফিল্ডের কাঁধে চ্যাটারসআইন্টাররেজ পদ্ধতিটি ব্যবহার করুন এবং নীচের মত ব্যবহার করুন।

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. এটি নির্দিষ্ট পাঠ্যক্ষেত্রের জন্য গ্রহণযোগ্য কীগুলির ধরণ সেট করবে।

প্রকারভেদ ...

কেবলমাত্র অক্ষরগুলিতেই রয়েছে // কেবলমাত্র অক্ষর গ্রহণ করে।

ক্যারাকটারস ইন // অক্ষরের সংমিশ্রণ গ্রহণ করে

doNotContainsCharactersIn // অক্ষর গ্রহণ করবে না

আশা করি এটি সাহায্য করেছে .... ধন্যবাদ ..


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
ইউআইটিেক্সটফিল্ড, ইউআইটিেক্সটভিউ নয়।
জনি

3

আমি @ ফ্রুওয়ের উপর ভিত্তি করে একটি পরিপূরক উত্তর দিচ্ছি। আমি মনে করি তার উত্তরটি সবচেয়ে সুন্দর উপায়। এটি পুনরায় ব্যবহার করতে পারি এটি একটি সাধারণ নিয়ন্ত্রণ বেক করুন।

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

এটি ইউআইটিেক্সটফিল্ডে সর্বোচ্চ দৈর্ঘ্য হ্যান্ডেল করার সঠিক উপায়, এটি রিটার্ন কীটি প্রথম প্রতিক্রিয়াকারী হিসাবে পাঠ্যক্ষেত্র থেকে পদত্যাগ করতে অনুমতি দেয় এবং ব্যবহারকারী যখন সীমাতে পৌঁছে তখন ব্যাকস্পেসকে দেয়

- (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>আপনার .h এ নীচের কোডটি যুক্ত করুন এবং আপনার মি। মি .... আপনি "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));
}

1

আমি স্টেটেক্সটফিল্ডের একটি ইউআইটিেক্সটফিল্ড সাবক্লাস খোলা করেছি , যা তার maxCharacterLengthসম্পত্তি সহ এই কার্যকারিতা (এবং আরও অনেক কিছু) সরবরাহ করে ।


1

এখন আপনি কতগুলি অক্ষর চান মান দিতে চান

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

নম্বর প্যাড ব্যবহার করার সময় আমি সুইফটে 8 টি অক্ষরের সীমাতে এটি করেছি।

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

স্ট্রিংয়ের জন্য আমাকে পরীক্ষা করতে হয়েছিল! = "" মুছে ফেলা বোতামটি নম্বর প্যাডে কাজ করার অনুমতি দেওয়ার জন্য, অন্যথায় এটি পাঠ্য ক্ষেত্রের অক্ষর সর্বাধিকতায় পৌঁছানোর পরে অনুমতি দেবে না।


1

জামারিনের জন্য:

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

1

আমি এটিতে সর্বাধিক দৈর্ঘ্যের সম্পত্তি যুক্ত করতে একটি ইউআইটিেক্সটফিল্ড এক্সটেনশন প্রয়োগ করেছি।

এটি এক্সকোড 6 আইবিআইস্পেসটেবলের উপর ভিত্তি করে, যাতে আপনি ইন্টারফেস বিল্ডারে সর্বোচ্চ দৈর্ঘ্য সীমাটি সেট করতে পারেন।

বাস্তবায়ন এখানে:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.