对于我正在编写的 iOS 应用程序,我使用的是 UITextView,用户可以在其中插入有限的文本。
对于 textview 有 2 个限制:
- 行不能超过 30 个字符
- UITextView 中只能有 20 行文本。
所以简而言之,最多是 20 行,每行 30 个字符。
当用户在 UITextView 中键入一些文本并且当前句子是 30 个字符时,我希望它自动插入一个新行\n
(在该行的最后一个单词之前)并强制最后一个单词和光标到下面的行。
当用户有 20 行 30 个字符(或者更简单地说:20 行,最后一行 30 个字符)时,我希望输入被阻止。
现在,其中大部分都相当“简单”,但我的代码没有考虑边界情况,比如在前面的行中插入文本。
我查看了来自 Apple 的文档,但我找不到一种方法来实际强制在 UITextView 上进行这种自动换行。
我的尝试是在shouldChangeTextInRange
委托方法中处理所有这些(使代码更加冗长,因此更易于阅读)。
#define MAX_LENGTH_LINE 30
#define MAX_LENGTH_ROWS 20
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
// Check for backspaces, they should always be allowed?
if ([text length] == 0 && ![text isEqualToString:@"\n"])
return YES;
NSArray* lines = [textView.text componentsSeparatedByString:@"\n"];
// Check if there are a maximum of lines and the last line is already maxed out
NSString* lastLine = [lines objectAtIndex:[lines count] - 1];
if (([lines count] == MAX_LENGTH_ROWS) &&
(lastLine != nil) &&
([lastLine length] > MAX_LENGTH_LINE) &&
([text length] > 0))
return NO;
if ((lastLine != nil) &&
([lastLine length] > MAX_LENGTH_LINE))
{
NSRange range = [textView.text rangeOfString:@" " options:NSBackwardsSearch];
NSRange breakRange = [textView.text rangeOfString:@"\n" options:NSBackwardsSearch];
if (breakRange.location == NSNotFound)
breakRange = NSMakeRange(0, 1);
if (range.location == NSNotFound) {
range = NSMakeRange(0, 1);
}
if (range.location > breakRange.location)
{
textView.text = [textView.text stringByReplacingCharactersInRange:NSMakeRange(range.location, 1) withString:@"\n"];
}
else
{
textView.text = [textView.text stringByAppendingString:@"\n"];
}
}
if ([text isEqualToString:@"\n"])
{
if ([lines count] == MAX_LENGTH_ROWS)
return NO;
else {
return YES;
}
NSRange range = NSMakeRange(textView.text.length - 1, 1);
[textView scrollRangeToVisible:range];
}
return YES;
}
与此同时,我已经有一段时间了,现在我失去了它。任何人都可以提供一些指针来将 UITextView 限制为我想要的 20 行/30 个字符的限制?