如何在UITextView中实现简单的“实时”字数

时间:2011-03-10 10:33:43

标签: iphone objective-c cocoa-touch uitextview

我正在尝试在用户输入文本时实现UITextView的简单字符数(即它应该连续更新)。

我有两个问题。

(1)首先,我不知道我应该在哪种方法中使用charCount方法。 textViewShouldBeginEditing不起作用,因为它只是询问是否应该开始编辑会话。 textView:shouldChangeTextInRange也不起作用,因为它再次询问是否允许开始编辑。我在Apple doc中找不到其他有用的方法。

(2)下一个问题:我试图从另一个方法中调用我的charCount方法。但是我得到了编译错误:'ViewController'可能无法响应'charCount'。

这是我谦虚的尝试:

- (IBAction)charCount:(id)sender {

// all chars
int charsAsInt = (int)(textView.text.length);
NSString *newText = [[NSString alloc] initWithFormat:@"All chars: %d", charsAsInt];
allCharacters.text = newText;
[newText release];}

- (BOOL)textViewShouldBeginEditing:(UITextView *)aTextView {

    [self charCount];}

我想这与我试图调用IBAction定义的方法有关,这不起作用。但是,在非IBAction方法中调用IBAction方法的正确方法是什么?

与往常一样,我很抱歉这些非常基本的问题,我非常感谢每一个小小的帮助,让我的初学者能够理解这一点。

9 个答案:

答案 0 :(得分:50)

我曾经这样创建,以防止UITextview仅键入 140 个字符。
我在UILabel中表示像这样计算

-(void)textViewDidChange:(UITextView *)textView 
{
   int len = textView.text.length;
   lbl_count.text=[NSString stringWithFormat:@"%i",140-len];
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    if([text length] == 0)
    {
        if([textView.text length] != 0)
        {
            return YES;
        }
    }
    else if([[textView text] length] > 139)
    {
        return NO;
    }
    return YES;
} 

这对你有帮助!!!

答案 1 :(得分:6)

  

textView:shouldChangeTextInRange也不起作用,因为它再次询问是否允许开始编辑。

但没有什么可以阻止你计算那里的人物。最后只返YES。

  

我想这与我试图调用IBAction定义的方法有关,这不起作用

您可以从代码中调用IBActions。 IBAction只是Interface Builder的关键词,但它与void相同。

但你必须使用正确的方法签名 您的方法- (IBAction)charCount:(id)sender有一个参数(id sender)
但是您的通话[self charCount]没有参数。

将其更改为[self charCount:nil],您应该没问题。


编辑:我现在没有textView,我现在懒得创建一个但是这适用于UITextField:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSInteger textLength = 0;
    textLength = [textField.text length] + [string length] - range.length;
    NSLog(@"Length: %d", textLength);
    return YES;
}

我将替换字符串的长度添加到字段的当前文本中。然后我减去更换范围的长度 你应该做一些实验来更好地理解那些之间的关系 基本上如果你覆盖一些文本,范围的长度将是你要覆盖的文本的长度(即所选文本的长度)

答案 2 :(得分:2)

您需要使用的只是代码中的textViewDidChange委托实现。 以下是您可能需要的示例实现:

    #pragma-mark TextView Delegates

- (void)textViewDidChange:(UITextView *)textView
{
    NSLog(@"len:%d",textView.text.length);
    txtLength=textView.text.length;
    lblString=[NSString stringWithFormat:@"%i",210-txtLength];
    if(txtLength>200)
    {
        charactersLabel.textColor=[UIColor redColor];
    }
    charactersLabel.text=lblString;
}

将标题中的三个使用的变量声明为:

int txtLength;
NSString *lblString;
IBOutlet UILabel *charactersLabel;

标签会在您输入时打印剩余的字符,当您在​​此处超过200时,它的颜色会变为红色。 最后不要忘记将TextView的委托连接到File的Owner&在头文件中添加UITextViewDelegate的实现。 希望它有所帮助..

答案 3 :(得分:2)

感谢n.evermind和Mathias Bauch的贡献。下面是我对 UITextField 的解决方案,它结合了两者的信息,像魅力一样设置字符限制,并渲染一个跟踪用户当前字符的标签。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    int maxLength = 40;
    int textLength = [textField.text length] + [string length] - range.length;

    if(textLength > maxLength)
    {
        return NO;
    }
    else
    {
        //self.currentLabel in this case is just a UILabel
        //it formats the counter like: 0/40
        self.currentLabel.text = [NSString stringWithFormat:@"%i/%i",textLength,maxLength];
        return YES;
    }
}

希望这有帮助!

答案 4 :(得分:1)

您可以使用此代码,假设您只想在视图中显示10个字符,并且还要更新计数

  

让我们假设coutLabel是我们必须更新的标签。   确保在nib文件或实现文件中附加了委托。

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSInteger textLength = 0;
    textLength = [textView.text length] + [text length] - range.length;
    if(10-textLength==-1)
    {
        return NO;
    }
    coutLabel.text = [NSString stringWithFormat:@"%d characters remaining", 10-textLength];

    return YES;}

答案 5 :(得分:1)

代码片段,用于使用颜色更新UI的实时字数。

#define kCharacterMaximumLimit 120
#define kCharacterWarningLimit 110

- (void)textViewDidChange:(UITextView *)textView {
    NSString *substring = [NSString stringWithString:textView.text];
    _lblCount.text = [NSString stringWithFormat:@"%i", kCharacterMaximumLimit-[substring length]];

    if (substring.length == 0)
        _lblCount.text = @"";

    if (substring.length < kCharacterWarningLimit)
        _lblCount.textColor = [UIColor darkGrayColor];

    if (substring.length >= kCharacterWarningLimit && substring.length < kCharacterMaximumLimit)
        _lblCount.textColor = [UIColor redColor];
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    if([text length] == 0)
    {
        if([textView.text length] != 0)
            return YES;
        else
            return NO;
    }

    if([[textView text] length] > kCharacterMaximumLimit-1)
        return NO;

    return YES;
}

答案 6 :(得分:0)

@fluchtpunkt:非常出色!这是更新的代码,以防有其他初学者寻找答案:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

[self charCount:nil];

// let the textView know that it should handle the inserted text
return YES; }

答案 7 :(得分:0)

这里我们选择最适合的。

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
}

答案 8 :(得分:-1)

一种简单的新手方法是实现每秒检查长度的NStimer

这样做添加“NSTimer countTimer;”到.h然后将其添加到.m

- (void)viewDidLoad {

countTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(countTextView) userInfo:nil repeats:YES];

}

- (无效)countTextView {

[countTimer invalidate];
int currentChars = [TextView.text length];

if ([TextView.text length]>100) {
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Too long"
        message:[NSString stringWithFormat:@"Only 100 chars allowed."]
        delegate:nil
        cancelButtonTitle:@"OK"
        otherButtonTitles:nil];
    [alert show];
    [alert release];
    TextView.text = [TextView.text substringToIndex:100];
}

counterLabel.text = [NSString stringWithFormat:@"%d",currentChars];

countTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(countTextView) userInfo:nil repeats:YES];

}