限制uitextview中的字符数


80

我正在提供文本视图来鸣叫一些字符串。

我正在应用以下方法将字符数限制为140个长度。

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

该代码运行良好,但第一个条件是退格键不起作用。假设我已经达到了140个字符的限制,因此该方法将给我错误,并且用户无法插入更多字符,但是此后,当我尝试删除一些字符时,文本视图将被禁用。

因此,问题是:“如何从textview.text文本视图中删除字符或重新启用文本视图?”


检查这个答案
Hemang 2013年

Answers:


67

你应该寻找一个空字符串代替,作为苹果基准

如果用户按Delete键,则范围的长度为1,并且空字符串对象替换了该单个字符。

我认为您实际要进行的检查类似于[[textView text] length] - range.length + text.length > 140,以说明剪切/粘贴操作。


谢谢,但可以更具体我无法理解苹果的技术规格
harshalb

请告诉我我应该放在第一个条件下。我为此花了将近4个小时的时间
harshalb

9
我认为您实际要进行的检查类似于[[textView text] length] - range.length + text.length > 140,以说明剪切/粘贴操作。
David Gelhar 2010年

2
[[textView文本]长度]-range.length + text.length> 140应为[[textView文本]长度]-range.length + text.length <140
Kuzon

Kuzon,如果您默认返回true,则不可以,如果超过140个字符的限制,则想返回false。

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

这说明了用户剪切文本,删除长度大于单个字符的字符串(即,如果他们选择然后按下退格键),突出显示范围并粘贴比其短或长的字符串。

Swift 4.0版本

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

这是IBAction吗?如何以用户类型将其连接到有问题的TextView?
学习者

1
要使您的视图控制器为UITextViewDelegate,然后将文件所有者作为文本视图的委托挂接起来
蒂姆

我认为问一个后续问题会更公平:我遇到了两个UITextviews问题,这些UITextviews在同一控制器中需要字符限制。你能帮忙吗?stackoverflow.com/questions/25272413/...
学习者

这应该标记为正确的响应。谢谢
Hernan Arber

如果粘贴的文本太长而无法容纳(因此false将被返回),这将导致崩溃,然后您将尝试撤消该操作。
Raimundas Sakalauskas

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

对于Swift 5和iOS 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
}
  • 该代码最重要的部分是从rangeNSRange)到rangeOfTextToReplaceRange<String.Index>)的转换。请参阅此视频教程,以了解为何此转换很重要。
  • 为了使此代码正常工作,您还应该将textFieldsmartInsertDeleteType值设置为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
在Swift 2中,您必须使用textView.text.characters.count或所需的任何编码:developer.apple.com/swift/blog/?
id=30

4

ue this

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

    int limit = 139;

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

}

这只会输入140个字符,您可以根据需要将其删除


4

限制溢出,而不是整个文本!

通过返回false...shouldChangeTextInRange...委托方法,你实际上是限制了整个文本和处理以下几种情况竟如此艰难:

  • 复制和粘贴
  • 选择文本区域并进行编辑
  • 使用自动提示
  • 使用语音输入(语音命令或听写)

所以你可以:

限制文字溢出

通过删除多余的字符:

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

你可以做到这一点,即使在飞行!通过将此代码放入或与事件的动作中。textViewtextField.editingChanged


将其func textViewDidChange(_ textView: UITextView) {...}完美地放置在UITextView委托的作品中,仅裁剪了长粘贴文本的末尾
Josselin

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

@Tim Gostony的Swift版本:

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

Swift5:

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

如果使用条件从文本视图中删除字符
Vikas Grandhi 2014年

0

这是限制用户在iOS swift中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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.