Uitextview में वर्णों की संख्या सीमित करें


80

मैं कुछ स्ट्रिंग को ट्वीट करने के लिए एक टेक्स्ट व्यू दे रहा हूं।

मैं वर्णों की संख्या को 140 की लंबाई तक सीमित करने के लिए निम्नलिखित विधि लागू कर रहा हूं।

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
   return [[textView text] length] <= 140;
}

कोड अच्छी तरह से काम कर रहा है पहली शर्त को छोड़कर कि बैकस्पेस काम नहीं कर रहा है। मान लीजिए कि मैं 140 वर्णों की सीमा तक पहुंच गया हूं, ताकि विधि मुझे झूठी बताएगी और उपयोगकर्ता अधिक वर्ण नहीं डाल सकता है, लेकिन उसके बाद जब मैं कुछ वर्णों को हटाने का प्रयास करता हूं तो पाठ दृश्य व्यवहार में अक्षम हो जाता है।

तो सवाल यह है: " textview.textपाठ दृश्य से पात्रों को कैसे हटाएं या फिर से सक्षम करें?"



जवाबों:


67

आपको सेब के संदर्भ के अनुसार खाली स्ट्रिंग की तलाश करनी चाहिए

यदि उपयोगकर्ता Delete कुंजी दबाता है, तो सीमा की लंबाई 1 है और एक रिक्त स्ट्रिंग ऑब्जेक्ट उस एकल वर्ण को बदल देता है।

मुझे लगता है कि वास्तव में आप जो चेक बनाना चाहते हैं, वह कुछ ऐसा है [[textView text] length] - range.length + text.length > 140, जैसे कि कट / पेस्ट ऑपरेशन के लिए।


धन्यवाद, लेकिन अधिक विशिष्ट हो सकता है मैं सेब के तकनीकी विनिर्देश को नहीं समझ सकता
हर्शल

बस मुझे बताओ कि मुझे पहली शर्त में क्या रखना चाहिए। मैं इसके लिए लगभग 4 घंटे गुजार रहा हूँ
harshalb

9
मुझे लगता है कि वास्तव में आप जो चेक बनाना चाहते हैं, वह कुछ ऐसा है [[textView text] length] - range.length + text.length > 140, जैसे कि कट / पेस्ट ऑपरेशन के लिए।
डेविड गेलर

2
[[TextView पाठ] लंबाई] - range.length + text.length> 140 होना चाहिए होना [[TextView पाठ] लंबाई] - range.length + text.length <140
Kuzon

कुज़ोन, यदि आप डिफ़ॉल्ट के रूप में सही नहीं लौट रहे हैं और यदि आप 140 char की सीमा से अधिक हैं तो गलत लौटना चाहते हैं।
पत्थर

165
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    return textView.text.length + (text.length - range.length) <= 140;
}

यह उन उपयोगकर्ताओं के लिए है जो टेक्स्ट को काटते हैं, या किसी एकल वर्ण की तुलना में लंबे समय तक तार को हटाते हैं (अर्थात यदि वे चयन करते हैं और फिर बैकस्पेस मारते हैं), या किसी श्रेणी को हाइलाइट करते हुए और उससे छोटे या लंबे समय तक तार चिपकाते हैं।

स्विफ्ट 4.0 संस्करण

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return textView.text.count + (text.count - range.length) <= 140
}

क्या यह एक IBAction है? मैं इसे उपयोगकर्ता प्रकार के रूप में टेक्स्टव्यू से कैसे जोड़ सकता हूं?
शिक्षार्थी

1
होगा अपने दृश्य नियंत्रक एक UITextViewDelegate बनाने और फिर पाठ के प्रतिनिधि के रूप में फ़ाइल के स्वामी को हुक करें
टिम

मुझे लगा कि अनुवर्ती प्रश्न पूछना अधिक उचित होगा: मैं दो UIText साक्षात्कार वाले मुद्दों के साथ एक ही नियंत्रक में वर्ण सीमा की आवश्यकता है। क्या आप मदद करेंगे? stackoverflow.com/questions/25272413/…
शिक्षार्थी

इसे सही प्रतिक्रिया के रूप में चिह्नित किया जाना चाहिए। धन्यवाद
हेर्नान आर्बर

यह एक दुर्घटना का कारण होगा यदि आप एक पाठ चिपकाते हैं जो फिट होने के लिए बहुत लंबा है (इसलिए falseवापस आ जाएगा) और फिर आप कार्रवाई को पूर्ववत करने का प्रयास करेंगे।
रायमुंडस सकलौसक

18

स्विफ्ट 4 के लिए:

//MARK:- TextView Delegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    //300 chars restriction
    return textView.text.count + (text.count - range.length) <= 300
}

10

हालाँकि आप नीचे काम कोड भी उपयोग कर सकते हैं ..

- (void)textViewDidChange:(UITextView *)textView{

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

    if([[textView text] length] > restrictedLength){
        textView.text=[temp substringToIndex:[temp length]-1];
    }
}

आम तौर पर यह सेट होने के बाद कुछ संपादित करने का पसंदीदा तरीका नहीं है। टेक्स्ट को संपादित करने से रोकने के लिए "shouldChangeCharactersInRange" में इसे बेहतर तरीके से जाँचना।
बेंजामिन पीट

7

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

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

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

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    @IBOutlet var textView: UITextView! // Link this to a UITextView in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

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

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        guard let rangeOfTextToReplace = Range(range, in: textView.text) else {
            return false
        }
        let substringToReplace = textView.text[rangeOfTextToReplace]
        let count = textView.text.count - substringToReplace.count + text.count
        return count <= 10
    }

}

5

स्विफ्ट:

// MARK: UITextViewDelegate

let COMMENTS_LIMIT = 255

func textView(textView: UITextView,  shouldChangeTextInRange range:NSRange, replacementText text:String ) -> Bool {
    return count(comments.text) + (count(text) - range.length) <= COMMENTS_LIMIT;
}

countElementscountस्विफ्ट 1.2 द्वारा प्रतिस्थापित किया गया है
टिम विंडसर ब्राउन

1
और स्विफ्ट 2 में आपको textView.text.characters.count या जो भी एन्कोडिंग आप चाहते हैं, वह है: developer.apple.com/swift/blog/?id=30
Heckscheibe

4

यह ue

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

    int limit = 139;

    return !([textField.text length]>limit && [string length] > range.length);

}

यह केवल १४० चार्ट में प्रवेश करेगा और जरूरत पड़ने पर आप इन्हें हटा सकते हैं


4

ओवरफ्लो को सीमित करें, पूरे पाठ को नहीं!

प्रतिनिधि विधि falseमें लौटकर ...shouldChangeTextInRange..., आप वास्तव में पूरे पाठ को सीमित कर रहे हैं और निम्नलिखित स्थितियों को संभालना इतना कठिन हो सकता है:

  • कॉपी और पेस्ट करना
  • पाठ का एक क्षेत्र चुनें और संपादित करें
  • ऑटो सुझाव का उपयोग करना
  • वॉयस इनपुट (वॉयस कमांड या डिक्टेशन) का उपयोग करना

तो तुम कर सकते हो:

बस पाठ अतिप्रवाह को सीमित करें

अतिरिक्त वर्ण हटाकर:

textView.text = String(textView.text.prefix(140))

आप इसे मक्खी पर भी कर सकते हैं ! इस कोड को क्रिया के अंदर textViewया घटना के textFieldसाथ डालकर .editingChanged


UITextView प्रतिनिधि के func textViewDidChange(_ textView: UITextView) {...}कार्यों को खूबसूरती से प्रस्तुत करते हुए, केवल एक लंबे चिपके हुए पाठ के अंत को
काटते हुए

2

हालाँकि मुझे एक if-elseशर्त की ज़रूरत थी , इसलिए इसने मेरे लिए काम किया:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    BOOL status = textView.text.length + (text.length - range.length) <= 15;
    if (status)
    {
        [self.btnShare setEnabled:YES];
        [self.btnShare setAlpha:1];
    }
    else
    {
        [self.btnShare setEnabled:NO];
        [self.btnShare setAlpha:0.25];
    }
    return status;
}

जानबूझकर बटन को अक्षम करने के लिए सेट किया गया है। लेकिन अगर आप चाहते हैं कि यूजर कैंट पोस्ट को एक खाली परीक्षण के तौर पर रखे, तो बटन पर एक शर्त रखें:

- (void)btnShare_click:(id)sender
{
    NSString *txt = [self.txtShare.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    if ([txt length] == 0)
    {
        [self.btnShare setEnabled:NO];
        [self.btnShare setAlpha:0.25f];
        [[[UIAlertView alloc]initWithTitle:nil message:@"Please enter some text to share." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        return;
    }
    .
    .
    .
    .
    .
    .
    // rest of your code
}

1

ऊपर दिए गए कुछ उत्तर के साथ समस्या यह है, उदाहरण के लिए मेरे पास एक पाठ क्षेत्र है और मुझे 15 वर्ण इनपुट की एक सीमा निर्धारित करनी है, फिर यह 15 वें वर्ण में प्रवेश करने के बाद बंद हो जाता है। लेकिन वे हटाने की अनुमति नहीं देते हैं। यही डिलीट बटन भी काम नहीं करता है। जैसा कि मैं एक ही समस्या का सामना कर रहा था। नीचे दिए गए समाधान के साथ आया। मेरे लिए बिल्कुल सही काम करता है

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 if(textField.tag==6)
 {
    if ([textField.text length]<=30)
    {
        return YES;   
    }
    else if([@"" isEqualToString:string])
    {
        textField.text=[textField.text substringToIndex:30 ];
    }

    return NO;
 }
 else
 {
    return YES;
 }
}

मेरे पास एक टेक्स्ट फ़ील्ड है, जिसका टैग मैंने "6" सेट किया है और मैंने अधिकतम चार सीमा = 30 को प्रतिबंधित कर दिया है; हर मामले में ठीक काम करता है


1

@ टिम गोस्टोनी स्विफ्ट संस्करण:

// restrict the input for textview to 500
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    return count(textView.text) + (count(text) - range.length) <= 500;
}

1

यहां हम सबसे अच्छे फिट के लिए जाते हैं। बचे वर्णों की संख्या प्रदर्शित करें: 'n' वर्ण बचे हैं।

var charCount = 0;
let maxLength = 150
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    if text == "" // Checking backspace
    {
        if textView.text.characters.count == 0
        {
            charCount = 0
            characterCount.text = String(format: "%i Characters Left", maxLength - charCount)
            return false
        }
        charCount = (textView.text.characters.count - 1)
        characterCount.text = String(format: "%i Characters Left", maxLength - charCount)
      return true
    }
    else
    {
        charCount = (textView.text.characters.count + 1)
        characterCount.text = String(format: "%i Characters Left", maxLength - charCount)

        if charCount >= maxLength + 1
        {
            charCount = maxLength
            characterCount.text = String(format: "%i Characters Left", maxLength - charCount)
            return false;
        }
    }
    return true
}

1

यदि आप ओवरफ्लो से काटते समय, और एक गिनती लेबल को अपडेट करते हुए अधिकतम वर्ण गणना तक कोड पेस्ट करने में सक्षम होना चाहते हैं, तो:

let maxChar: Int
let countLabel: UILabel

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let oldChar = textView.text.count - range.length
    let oldRemainingChar = maxChar - oldChar
    let newChar = oldChar + text.count
    let newRemainingChar = maxChar - newChar
    let replaceChar = newRemainingChar > 0 ? text.count : oldRemainingChar

    if
        let textRange = textView.textRange(for: range),
        replaceChar > 0 || range.length > 0
    {
        textView.replace(textRange, withText: String(text.prefix(replaceChar)))
        countLabel.text = String(describing: maxChar - textView.text.count)
    }

    return false
}

एक्सटेंशन के साथ:

extension UITextInput {
    func textRange(for range: NSRange) -> UITextRange? {
        var result: UITextRange?

        if
            let start = position(from: beginningOfDocument, offset: range.location),
            let end = position(from: start, offset: range.length)
        {
            result = textRange(from: start, to: end)

        }

        return result
    }
}

1

इसे आज़माएं: -

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    print("chars \(textView.text.count) \( text)")

    if(textView.text.count > 20 && range.length == 0) {
        print("Please summarize in 20 characters or less")
        return false
    }
    return true
}

0

textView:shouldChangeTextInRange:replacementText:विधि में नीचे कोड लिखें :

if ([textView.text length]>=3 && ![text isEqualToString:@""]) {
    return NO;
}
return YES;

0

स्विफ्ट 5:

let maxChars = 255

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  if maxChars - aTextView.text.count == 0 {
    if range.length != 1 {
    return false
    }
  }
  return true
}

0

निम्नलिखित कोड का उपयोग करें।

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    if(text.length == 0)
    {
        return YES;
    }
    else if(self.txtViewComments.text.length > 255)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

यदि पाठ के दृश्य से पात्रों को हटाने के लिए स्थिति का उपयोग किया जाता है
विकास ग्रांधी

0

यहां उपयोगकर्ता को प्रतिबंधित करने UITextFieldया UITextViewआईओएस स्विफ्ट में वर्ण दर्ज करने के लिए सबसे सरल उपाय है

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
{
   return textField.text!.count < limit ? true : false
}

नोट: यहाँ सीमा से कुछ भी हो सकता 1करने के लिए nअपने आवश्यकता के अनुसार, के लिए उदाहरण के लिए: अगर आप की तुलना में फोन नंबर पर काम कर limitमान होगा 10 अगर तुम पर एक ही लागू करना चाहते हैं UITextViewतो बस विधि में बदलाव किया जाएगा और स्थान पर की textfieldआप उपयोग किया जाएगाtextview

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.