【发布时间】:2011-01-02 00:02:57
【问题描述】:
我有一个 UITextView,用户最多可以在 textView 中写入 160 个字符。 如何修复 UITextView 的最大文本长度?
【问题讨论】:
-
这不是重复的......用户需要一种方法来确定
UITextView而不是UITextField的长度
标签: iphone uitextview
我有一个 UITextView,用户最多可以在 textView 中写入 160 个字符。 如何修复 UITextView 的最大文本长度?
【问题讨论】:
UITextView而不是UITextField的长度
标签: iphone uitextview
这段代码也适用于复制/粘贴,但也适用于尝试粘贴会使文本视图超出限制的字符数的情况。在这种情况下,只会粘贴字符串的第一个字符。
#define MAX_LENGTH 15 // Whatever your limit is
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
NSUInteger newLength = (textView.text.length - range.length) + text.length;
if(newLength <= MAX_LENGTH)
{
return YES;
} else {
NSUInteger emptySpace = MAX_LENGTH - (textView.text.length - range.length);
textView.text = [[[textView.text substringToIndex:range.location]
stringByAppendingString:[text substringToIndex:emptySpace]]
stringByAppendingString:[textView.text substringFromIndex:(range.location + range.length)]];
return NO;
}
}
【讨论】:
替换
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
与
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
回答here
【讨论】:
这个答案迟到了; manicaesar 的解决方案对我不起作用。这是我对相同想法的实现:
#define MAX_LENGTH 140
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)replacementText
{
NSString *newText = [ textView.text stringByReplacingCharactersInRange: range withString: replacementText ];
if( [newText length]<= MAX_LENGTH ){
return YES;
}
// case where text length > MAX_LENGTH
textView.text = [ newText substringToIndex: MAX_LENGTH ];
return NO;
}
【讨论】:
斯威夫特 4,
我在 swift 4 中编写了 UITextView 的扩展,用于使代码可重用。也适用于复制粘贴。
private var maxLengths = [UITextView: Int]()
extension UITextView : UITextViewDelegate {
@IBInspectable var maxLength: Int {
get {
guard let length = maxLengths[self]
else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
self.delegate = self
}
}
@objc func limitLength(textView: UITextView) {
guard let prospectiveText = textView.text,
prospectiveText.count > maxLength
else {
return
}
let selection = selectedTextRange
let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
text = String(prospectiveText[..<maxCharIndex])
selectedTextRange = selection
}
public func textViewDidChange(_ textView: UITextView) {
limitLength(textField:textView)
}
public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
scrollToBottom()
return true
}
public func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
scrollToBottom()
return true
}
func scrollToBottom() {
let location = text.count - 1
let bottom = NSMakeRange(location, 1)
self.scrollRangeToVisible(bottom)
}
}
在情节提要中设置最大长度值,
【讨论】:
斯威夫特
fileprivate let maxLen = 5
extension MyViewController : UITextViewDelegate{
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let newLen = (textView.text.count - range.length) + text.count
return newLen <= maxLen
}
}
【讨论】: