2010-03-22 4 views
63

Я даю текстовое представление для твита некоторой строки.Ограничить количество символов в uitextview

Я применяю следующий метод, чтобы ограничить количество символов до 140.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ 


    if([text isEqualToString:@"\b"]){ 
     DLog(@"Ohoooo"); 
     return YES; 
    }else if([[textView text] length] > 140){ 

     return NO; 
    } 

    return YES; 
} 

Код работает красиво, кроме первого условия, что backspace не работает. предположим, что я достиг предела в 140 символов, чтобы метод дал мне ложь, и пользователь не может вставить больше символов, но после этого, когда я пытаюсь удалить некоторые символы, текстовое представление ведет себя так, как будто оно отключено.

Итак, вопрос, как удалить символы из textview.text или снова включить текстовое представление.

+0

Проверьте это [ответ] (http://stackoverflow.com/q/433337/1603234) – Hemang

+0

@Hemang http://stackoverflow.com/a/41380869/2910061 – ilesh

ответ

53

Вы должны искать пустую строку, вместо того, чтобы, как говорит apple reference

Если пользователь нажимает клавишу Delete, длина диапазона 1 и пустой объект строки заменяет, что один символ.

Я думаю, что проверка, которую вы действительно хотите сделать, это что-то вроде [[textView text] length] - range.length + text.length > 140, для учета операций вырезания/вставки.

+0

спасибо, но может быть более конкретным Я не могу понять техническую спецификацию яблока – harshalb

+0

просто скажите мне, что я должен поставить в первом условии. Я собираюсь за это почти 4 часа – harshalb

+0

ok получил его как range.length == 1 он отлично работает – harshalb

141
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 
    return textView.text.length + (text.length - range.length) <= 140; 
} 

Это объясняет пользователям резки текста или удаление строк длиной более одного символа (т.е. если они выбирают, а затем ударил забой), или выделив диапазон и вставки строк короче или длиннее, чем это.

Swift 2.0 Версия

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    return textView.text.characters.count + (text.characters.count - range.length) <= 140 
} 
+0

это IBAction? как подключить его к рассматриваемому TextView в качестве типов пользователей? – learner

+1

Должен сделать ваш контроллер представления UITextViewDelegate, а затем подключить владельца файла в качестве делегата текстового представления. – Tim

+0

. Я подумал, что было бы более справедливо задавать следующий вопрос: у меня возникают проблемы с наличием двух UITextview, которым нужны ограничения символов в одном контроллере , Не могли бы вы помочь? http://stackoverflow.com/questions/25272413/limit-number-of-characters-user-may-inter-into-multiple-uitextviews – learner

9

Однако вы можете использовать ниже рабочего кода также ..

- (void)textViewDidChange:(UITextView *)textView{ 

    NSInteger restrictedLength=140; 

    NSString *temp=textView.text; 

    if([[textView text] length] > restrictedLength){ 
     textView.text=[temp substringToIndex:[temp length]-1]; 
    } 
} 
+0

Обычно не является предпочтительным способом редактировать что-то после его установки. Лучше проверьте это в «shouldChangeCharactersInRange», чтобы предотвратить редактирование текста. –

5

у.е этого

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 

    int limit = 139; 

    return !([textField.text length]>limit && [string length] > range.length); 

} 

это будет ввести только 140 символ, и вы можете удалить при необходимости

1

Проблема с некоторыми из приведенных выше ответов: например, у меня есть текстовое поле, и я должен установить ограничение на 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» и я ограничил максимальный предел обугленного = 30; отлично работает в любом случае

0

Записать ниже код в textView:shouldChangeTextInRange:replacementText: метод:

if ([textView.text length]>=3 && ![text isEqualToString:@""]) { 
    return NO; 
} 
return YES; 
0
Use the following code... 
- (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; 
    } 
} 
+0

если условие используется для удаления символов из текстового вида –

4

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; 
} 
+0

'countElements' был заменен на' count' в swift 1.2 –

+1

, а в Swift 2 вы должны указать textView.text.characters.count или любую необходимую кодировку: https://developer.apple.com/swift/blog/?id=30 – Heckscheibe

2

Хотя мне нужна 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 
} 
1

Gostony @ Тим «s Swift Версии:

// 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; 
} 
0

Здесь мы идем для наилучшего. Отобразить оставшееся количество символов: '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 
} 
1

Попробуйте это: -

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    print("chars \(textView.text.characters.count) \(text)") 

    if(textView.text.characters.count > 20 && range.length == 0) { 
     print("Please summarize in 20 characters or less") 
     return false; 
    } 

    return true; 
} 
3

для быстрой 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; 
} 
Смежные вопросы