我正在尝试在用户输入文本时实现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方法的正确方法是什么?
与往常一样,我很抱歉这些非常基本的问题,我非常感谢每一个小小的帮助,让我的初学者能够理解这一点。
答案 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];
}