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;
}
백 스페이스가 작동하지 않는 첫 번째 조건을 제외하고 코드는 잘 작동합니다. 메서드가 나에게 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];
}
}
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 자만 입력되며 필요한 경우 삭제할 수 있습니다.
빠른:
// 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;
}
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
의smartInsertDeleteType
값 도로 설정해야 합니다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
}
}
나는 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"으로 설정되어 있고 최대 문자 제한 = 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
}
이것을 시도하십시오 :-
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;
}
오버플로를 잘라 내고 개수 레이블을 업데이트하면서 최대 문자 수까지 코드를 붙여 넣을 수있는 방법을 찾고 있다면 :
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
}
}
textView:shouldChangeTextInRange:replacementText:
메서드 에서 아래 코드를 작성하십시오 .
if ([textView.text length]>=3 && ![text isEqualToString:@""]) {
return NO;
}
return YES;
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;
}
}
참고URL : https://stackoverflow.com/questions/2492247/limit-number-of-characters-in-uitextview
'program story' 카테고리의 다른 글
JSON 객체를 예쁘게 인쇄 된 JSON으로 변환하는 Angular 2 파이프 (0) | 2020.10.20 |
---|---|
익명 유형 목록의 선언 (0) | 2020.10.20 |
matplotlib에서 막대 높이의 합이 1 인 히스토그램 플로팅 (0) | 2020.10.20 |
문자열의 최소 및 최대 길이를 확인하지만 공백 일 수 있음 (0) | 2020.10.20 |
String이 있는데 왜 StringBuilder인가? (0) | 2020.10.20 |