uitextview의 문자 수 제한


80

일부 문자열을 트윗하는 텍스트보기를 제공하고 있습니다.

다음 방법을 적용하여 문자 수를 140 자로 제한합니다.

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

백 스페이스가 작동하지 않는 첫 번째 조건을 제외하고 코드는 잘 작동합니다. 메서드가 나에게 false를 제공하고 사용자가 더 많은 문자를 삽입 할 수 없지만 그 후에 일부 문자를 삭제하려고하면 텍스트보기가 비활성화 된 것처럼 동작하도록 140 자 제한에 도달했다고 가정합니다.

따라서 질문은 " textview.text텍스트보기 에서 문자를 삭제 하거나 다시 활성화하는 방법"입니다.


이 체크 대답
Hemang

답변:


67

사과 참조에 따르면 대신 빈 문자열을 찾아야합니다.

사용자가 Delete 키를 누르면 범위의 길이는 1이고 빈 문자열 개체가 해당 단일 문자를 대체합니다.

실제로 만들고 싶은 수표 [[textView text] length] - range.length + text.length > 140는 잘라 내기 / 붙여 넣기 작업을 설명하기 위해 와 같은 것 입니다.


감사 합니다만 더 구체적으로
말씀

첫 번째 조건에 무엇을 넣어야하는지 알려주세요. 나는 거의 4 시간 동안
이것을 구르고있다

9
실제로 만들고 싶은 수표 [[textView text] length] - range.length + text.length > 140는 잘라 내기 / 붙여 넣기 작업을 설명하기 위해 와 같은 것 입니다.
David Gelhar

2
[[textView text] 길이]-range.length + text.length> 140은 [[textView text] 길이] 여야합니다.-range.length + text.length <140
Kuzon 2014 년

Kuzon은 기본적으로 true를 반환하고 140 자 제한을 초과하면 false를 반환하려는 경우가 아닙니다.

165
- (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
}

IBAction입니까? 사용자 유형으로 문제의 TextView에 어떻게 연결합니까?
학습자

1
뷰 컨트롤러를 UITextViewDelegate로 만든 다음 파일의 소유자를 텍스트 뷰의 델리게이트로 연결해야합니다.
Tim

후속 질문을하는 것이 더 공정 할 것이라고 생각했습니다. 동일한 컨트롤러에서 문자 제한이 필요한 두 개의 UITextview를 갖는 데 문제가 있습니다. 도와 주 시겠어요? stackoverflow.com/questions/25272413/…
학습자

이것은 올바른 응답으로 표시되어야합니다. 감사합니다
Hernan Arber

너무 긴 텍스트를 붙여 넣으면 (따라서 false반환 됨) 작업을 취소하려고 하면 충돌이 발생합니다 .
Raimundas Sakalauskas

18

신속한 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
}

10

그러나 아래의 작업 코드도 사용할 수 있습니다.

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

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

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

일반적으로 설정 후 편집하는 데 선호되는 방법은 아닙니다. 텍스트가 편집되지 않도록 "shouldChangeCharactersInRange"에서이를 확인하는 것이 좋습니다.
Benjamin Piette 2015 년

7

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>). 이 변환이 중요한 이유를 이해하려면 이 비디오 자습서 를 참조하십시오 .
  • 이 코드가 제대로 작동하도록하려면 textFieldsmartInsertDeleteType값 도로 설정해야 합니다 UITextSmartInsertDeleteType.no. 이렇게하면 붙여 넣기 작업을 수행 할 때 (원치 않는) 추가 공간이 삽입되는 것을 방지 할 수 있습니다.

어떻게 구현하는 방법을 보여줍니다 아래의 완전한 샘플 코드 textView(_:shouldChangeTextIn:replacementText:)A의 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
    }

}

5

빠른:

// 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빠른 1.2
팀 윈저 브라운

1
그리고 Swift 2에서는 textView.text.characters.count 또는 원하는 인코딩을해야합니다 : developer.apple.com/swift/blog/?id=30
Heckscheibe

4

ue this

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

    int limit = 139;

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

}

140 자만 입력되며 필요한 경우 삭제할 수 있습니다.


4

전체 텍스트가 아닌 오버플로를 제한하십시오!

대리자 메서드 false에서 반환 ...shouldChangeTextInRange...하면 실제로 전체 텍스트를 제한하고 다음 상황을 처리하는 것이 매우 어려울 수 있습니다.

  • 복사 및 붙여 넣기
  • 텍스트 영역을 선택하고 편집
  • 자동 제안 사용
  • 음성 입력 사용 (음성 명령 또는 받아쓰기)

따라서 다음을 수행 할 수 있습니다.

텍스트 오버플로 제한

추가 문자 제거 :

textView.text = String(textView.text.prefix(140))

즉석 에서도 할 수 있습니다 ! 내부에이 코드를 넣어 행동textView또는 textField.editingChanged이벤트입니다.


이것을 UITextView 델리게이트의 func textViewDidChange(_ textView: UITextView) {...}작업에 아름답게 배치 하여 긴 붙여 넣은 텍스트의 끝 부분 만 잘라냅니다
Josselin

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

위에 주어진 답변 중 일부의 문제는 예를 들어 텍스트 필드가 있고 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을 제한 한 텍스트 필드가 있습니다. 모든 경우에 잘 작동합니다


1

@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;
}

1

여기에 가장 적합한 제품을 선택합니다. 남은 문자 수 표시 : '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

오버플로를 잘라 내고 개수 레이블을 업데이트하면서 최대 문자 수까지 코드를 붙여 넣을 수있는 방법을 찾고 있다면 :

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
    }
}

1

이것을 시도하십시오 :-

 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
}

0

textView:shouldChangeTextInRange:replacementText:메서드 에서 아래 코드를 작성하십시오 .

if ([textView.text length]>=3 && ![text isEqualToString:@""]) {
    return NO;
}
return YES;

0

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
}

0

다음 코드를 사용하십시오.

- (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;
    }
}

조건은 텍스트 뷰에서 문자를 삭제하는 사용하는 경우
카스 Grandhi을

0

다음은 사용자가 iOS UITextField에서 문자 수를 입력하도록 제한하는 가장 간단한 솔루션입니다.UITextView

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
{
   return textField.text!.count < limit ? true : false
}

참고 : 여기에 제한에서 아무것도 할 수 있습니다 1n당신보다 전화 번호 일 경우 : 귀하의 요구 사항에 따라, 예 : limit것입니다 값 10 이에 동일 적용 할 경우 UITextView변경 될 것입니다 단지 방법과 장소에서의에게 textfield당신이 사용됩니다textview

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.