Я даю текстовое представление, чтобы написать какую-то строку.
Я применяю следующий метод, чтобы ограничить количество символов до 140.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
return [[textView text] length] <= 140;
}
Код работает нормально, за исключением первого условия, что backspace не работает. предположим, что я достиг предела в 140 символов, поэтому метод выдаст мне false, и пользователь не сможет вставить больше символов, но после этого, когда я пытаюсь удалить некоторые символы, текстовое представление ведет себя так, как оно отключено.
Возникает вопрос: «Как удалить символы из textview.text
текстового представления или снова включить его?»
ios
iphone
uitextview
uitextviewdelegate
харшальб
источник
источник
Ответы:
Вместо этого вы должны искать пустую строку, как говорится в ссылке на яблоко
Я думаю, что проверка, которую вы действительно хотите сделать, - это что-то вроде
[[textView text] length] - range.length + text.length > 140
учета операций вырезания / вставки.источник
[[textView text] length] - range.length + text.length > 140
учета операций вырезания / вставки.- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { return textView.text.length + (text.length - range.length) <= 140; }
Это позволяет пользователям вырезать текст или удалять строки, длина которых превышает один символ (т.е. если они выбирают и затем нажимают клавишу возврата), или выделяют диапазон и вставляют строки короче или длиннее, чем он.
Версия Swift 4.0
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { return textView.text.count + (text.count - range.length) <= 140 }
источник
false
будет возвращен), а затем вы попытаетесь отменить действие.для быстрого 4:
//MARK:- TextView Delegate func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { //300 chars restriction return textView.text.count + (text.count - range.length) <= 300 }
источник
Однако вы также можете использовать приведенный ниже рабочий код.
- (void)textViewDidChange:(UITextView *)textView{ NSInteger restrictedLength=140; NSString *temp=textView.text; if([[textView text] length] > restrictedLength){ textView.text=[temp substringToIndex:[temp length]-1]; } }
источник
В Swift 5 и iOS 12 попробуйте следующую реализацию
textView(_:shouldChangeTextIn:replacementText:)
метода, являющегося частьюUITextViewDelegate
протокола:func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { guard let rangeOfTextToReplace = Range(range, in: textView.text) else { return false } let substringToReplace = textView.text[rangeOfTextToReplace] let count = textView.text.count - substringToReplace.count + text.count return count <= 10 }
range
(NSRange
) вrangeOfTextToReplace
(Range<String.Index>
). Посмотрите этот видеоурок, чтобы понять, почему это преобразование важно.textField
«SsmartInsertDeleteType
значениеUITextSmartInsertDeleteType.no
. Это предотвратит возможную вставку (нежелательного) лишнего пробела при выполнении операции вставки.Полный пример кода ниже показывает, как реализовать
textView(_:shouldChangeTextIn:replacementText:)
вUIViewController
:import UIKit class ViewController: UIViewController, UITextViewDelegate { @IBOutlet var textView: UITextView! // Link this to a UITextView in Storyboard override func viewDidLoad() { super.viewDidLoad() textView.smartInsertDeleteType = UITextSmartInsertDeleteType.no textView.delegate = self } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { guard let rangeOfTextToReplace = Range(range, in: textView.text) else { return false } let substringToReplace = textView.text[rangeOfTextToReplace] let count = textView.text.count - substringToReplace.count + text.count return count <= 10 } }
источник
Swift:
// MARK: UITextViewDelegate let COMMENTS_LIMIT = 255 func textView(textView: UITextView, shouldChangeTextInRange range:NSRange, replacementText text:String ) -> Bool { return count(comments.text) + (count(text) - range.length) <= COMMENTS_LIMIT; }
источник
countElements
был заменен наcount
Swift 1.2уэ это
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { int limit = 139; return !([textField.text length]>limit && [string length] > range.length); }
это будет вводить только 140 символов, и вы можете удалить их при необходимости
источник
Ограничьте переполнение, а не весь текст!
По возвращению
false
в...shouldChangeTextInRange...
методе делегата, вы на самом деле ограничиваете весь текст и обработки следующих ситуаций могут быть так трудно:Так что вы можете:
Просто ограничьте переполнение текста
Удалив лишние символы:
textView.text = String(textView.text.prefix(140))
Вы можете сделать это даже на лету ! поместив этот код в действие объекта
textView
илиtextField
с.editingChanged
событием.источник
func textViewDidChange(_ textView: UITextView) {...}
прекрасно работает, только обрезая конец длинного вставленного текстаХотя мне нужно было
if-else
условие, поэтому у меня это сработало:- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { BOOL status = textView.text.length + (text.length - range.length) <= 15; if (status) { [self.btnShare setEnabled:YES]; [self.btnShare setAlpha:1]; } else { [self.btnShare setEnabled:NO]; [self.btnShare setAlpha:0.25]; } return status; }
Изначально кнопка отключена. Но если вы хотите, чтобы пользователь не мог опубликовать пустой тест, просто поставьте условие для нажатия кнопки:
- (void)btnShare_click:(id)sender { NSString *txt = [self.txtShare.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([txt length] == 0) { [self.btnShare setEnabled:NO]; [self.btnShare setAlpha:0.25f]; [[[UIAlertView alloc]initWithTitle:nil message:@"Please enter some text to share." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; return; } . . . . . . // rest of your code }
источник
Проблема с некоторыми из приведенных выше ответов: например, у меня есть текстовое поле, и я должен установить ограничение в 15 символов ввода, затем он останавливается после ввода 15-го символа. но они не позволяют удалить. То есть кнопка удаления тоже не работает. Поскольку я столкнулся с той же проблемой. Вышел с решением, данным ниже. Идеально подходит для меня
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(textField.tag==6) { if ([textField.text length]<=30) { return YES; } else if([@"" isEqualToString:string]) { textField.text=[textField.text substringToIndex:30 ]; } return NO; } else { return YES; } }
У меня есть текстовое поле, тег которого я установил "6", и я ограничил max char limit = 30; отлично работает в любом случае
источник
Быстрая версия @Tim Gostony:
// restrict the input for textview to 500 func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { return count(textView.text) + (count(text) - range.length) <= 500; }
источник
Вот и все, что вам нужно. Отобразить количество оставшихся символов: осталось n символов.
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 }
источник
Если вы также хотите вставить код до максимального количества символов, отключая переполнение и обновляя метку счетчика:
let maxChar: Int let countLabel: UILabel func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let oldChar = textView.text.count - range.length let oldRemainingChar = maxChar - oldChar let newChar = oldChar + text.count let newRemainingChar = maxChar - newChar let replaceChar = newRemainingChar > 0 ? text.count : oldRemainingChar if let textRange = textView.textRange(for: range), replaceChar > 0 || range.length > 0 { textView.replace(textRange, withText: String(text.prefix(replaceChar))) countLabel.text = String(describing: maxChar - textView.text.count) } return false }
С расширением:
extension UITextInput { func textRange(for range: NSRange) -> UITextRange? { var result: UITextRange? if let start = position(from: beginningOfDocument, offset: range.location), let end = position(from: start, offset: range.length) { result = textRange(from: start, to: end) } return result } }
источник
Попробуйте это: -
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { print("chars \(textView.text.count) \( text)") if(textView.text.count > 20 && range.length == 0) { print("Please summarize in 20 characters or less") return false } return true }
источник
Напишите ниже код в
textView:shouldChangeTextInRange:replacementText:
методе:if ([textView.text length]>=3 && ![text isEqualToString:@""]) { return NO; } return YES;
источник
Swift5:
let maxChars = 255 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { if maxChars - aTextView.text.count == 0 { if range.length != 1 { return false } } return true }
источник
Используйте следующий код.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if(text.length == 0) { return YES; } else if(self.txtViewComments.text.length > 255) { return NO; } else { return YES; } }
источник
Вот простейшее решение для ограничения пользователя вводить количество символов
UITextField
вUITextView
iOS swift или в него.func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { return textField.text!.count < limit ? true : false }
Примечание: здесь ограничение может быть любым от
1
доn
в соответствии с вашим требованием, например: если вы работаете с номером телефона,limit
значение будет,10
если вы хотите применить то же самое,UITextView
только метод будет изменен, и в том месте, гдеtextfield
вы будете использоватьtextview
источник