私はUITextViewを持っていますが、ユーザーはtextViewに最大160文字を書き込むことができます。 UITextViewの最大テキスト長を固定するにはどうすればよいですか?
交換する
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
と
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
これは答えられます ここ
このコードのチャンクはコピー/貼り付けでも機能しますが、テキストビューが制限を超える文字数を貼り付けようとする場合の状況にも対応します。その場合、文字列の最初の文字のみが貼り付けられます。
#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;
}
}
この答えに遅れます。 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;
}
Swift 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)
}
}
ストーリーボードで最大長の値を設定し、
スウィフト3
fileprivate let maxLen = 5
extension MyViewController : UITextViewDelegate{
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let newLen = (textView.text.characters.count - range.length) + text.characters.count
return newLen <= maxLen
}
}