[ios] uitextview의 문자 수 제한

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

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

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

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

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



답변

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

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

실제로 만들고 싶은 수표 [[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
}


답변

신속한 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>). 이 변환이 중요한 이유를 이해하려면 이 비디오 자습서 를 참조하십시오 .
  • 이 코드가 제대로 작동하도록하려면 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
    }

}


답변

빠른:

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


답변

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 자만 입력되며 필요한 경우 삭제할 수 있습니다.