Giới hạn số ký tự trong uitextview


79

Tôi đang đưa ra một chế độ xem văn bản để tweet một số chuỗi.

Tôi đang áp dụng phương pháp sau để hạn chế số lượng ký tự ở độ dài 140.

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

Mã đang hoạt động tốt ngoại trừ điều kiện đầu tiên là backspace không hoạt động. giả sử rằng tôi đã đạt đến giới hạn 140 ký tự thì phương thức sẽ cho tôi là false và người dùng không thể chèn thêm ký tự nhưng sau đó khi tôi cố gắng xóa một số ký tự, chế độ xem văn bản sẽ hoạt động như nó bị tắt.

Vì vậy, câu hỏi là: "Làm thế nào để xóa các ký tự khỏi textview.texthoặc bật lại chế độ xem văn bản?"


Kiểm tra này câu trả lời
Hemang

Câu trả lời:


67

Thay vào đó, bạn nên tìm kiếm một chuỗi trống, như tham chiếu apple cho biết

Nếu người dùng nhấn phím Delete, độ dài của phạm vi là 1 và một đối tượng chuỗi trống sẽ thay thế ký tự đơn đó.

Tôi nghĩ rằng séc bạn thực sự muốn thực hiện là một cái gì đó giống như [[textView text] length] - range.length + text.length > 140, để giải thích cho các hoạt động cắt / dán.


cảm ơn, nhưng có thể có nhiều cụ thể tôi không thể hiểu được đặc tả kỹ thuật của táo
harshalb

chỉ cho tôi biết tôi nên đặt những gì trong điều kiện đầu tiên. Tôi đang tìm kiếm điều này trong gần 4 giờ
harshalb

9
Tôi nghĩ rằng séc bạn thực sự muốn thực hiện là một cái gì đó giống như [[textView text] length] - range.length + text.length > 140, để giải thích cho các hoạt động cắt / dán.
David Gelhar

2
[[TextView văn] chiều dài] - range.length + text.length> 140 nên được [[TextView văn] chiều dài] - range.length + text.length <140
Kuzon

Kuzon, không nếu bạn đang trả về true như mặc định và muốn trả về false nếu bạn vượt quá giới hạn 140 ký tự.
stone

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

Điều này giải thích cho việc người dùng cắt văn bản hoặc xóa các chuỗi dài hơn một ký tự (tức là nếu họ chọn và sau đó nhấn phím xóa lùi) hoặc đánh dấu một dải ô và dán các chuỗi ngắn hơn hoặc dài hơn nó.

Phiên bản Swift 4.0

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

Đây có phải là một IBAction không? làm cách nào để kết nối nó với TextView được đề cập dưới dạng người dùng?
người học

1
Phải đặt bộ điều khiển chế độ xem của bạn thành UITextViewDelegate và sau đó kết nối chủ sở hữu tệp với tư cách là đại biểu của chế độ xem văn bản
Tim

Tôi nghĩ sẽ công bằng hơn nếu đặt một câu hỏi tiếp theo: Tôi đang gặp vấn đề với việc có hai UITextview cần giới hạn ký tự trong cùng một bộ điều khiển. Bạn sẽ vui lòng giúp đỡ? stackoverflow.com/questions/25272413/…
người học

Đây phải được đánh dấu là câu trả lời chính xác. Cảm ơn bạn
Hernan Arber

Điều này sẽ gây ra lỗi nếu bạn dán một văn bản quá dài để vừa (do đó falsesẽ bị trả lại) và sau đó bạn sẽ cố gắng hoàn tác hành động.
Raimundas Sakalauskas

18

cho nhanh 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

Tuy nhiên, bạn cũng có thể sử dụng mã làm việc bên dưới ..

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

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

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

Nói chung không phải là cách ưa thích để chỉnh sửa một cái gì đó sau khi nó đã được thiết lập. Tốt hơn nên kiểm tra điều này trong "shouldChangeCharactersInRange" để ngăn văn bản bị chỉnh sửa.
Benjamin Piette

7

Với Swift 5 và iOS 12, hãy thử triển khai textView(_:shouldChangeTextIn:replacementText:)phương pháp sau đây là một phần của UITextViewDelegategiao thức:

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
}
  • Phần quan trọng nhất của mã này là chuyển đổi từ range( NSRange) sang rangeOfTextToReplace( Range<String.Index>). Xem hướng dẫn bằng video này để hiểu tại sao chuyển đổi này lại quan trọng.
  • Để làm cho mã này hoạt động bình thường, bạn cũng nên đặt giá trị textFieldcủa 's smartInsertDeleteTypethành UITextSmartInsertDeleteType.no. Điều này sẽ ngăn chặn việc có thể chèn thêm một khoảng trống (không mong muốn) khi thực hiện thao tác dán.

Mã mẫu hoàn chỉnh bên dưới cho thấy cách triển khai textView(_:shouldChangeTextIn:replacementText:)trong 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

Nhanh:

// 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đã được thay thế bởi counttrong nhanh chóng 1.2
Tim Windsor Brown

1
và trong Swift 2 bạn phải để textView.text.characters.count hoặc bất cứ điều gì bạn muốn mã hóa: developer.apple.com/swift/blog/?id=30
Heckscheibe

4

ue cái này

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

    int limit = 139;

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

}

điều này sẽ chỉ nhập 140 ký tự và bạn có thể xóa chúng nếu cần


4

Hạn chế tràn, không phải toàn bộ văn bản!

Bằng cách quay lại falsetrong ...shouldChangeTextInRange...phương thức ủy nhiệm, bạn thực sự đang giới hạn toàn bộ văn bản và việc xử lý các tình huống sau có thể rất khó:

  • Sao chép và dán
  • Chọn một vùng của văn bản và chỉnh sửa
  • Sử dụng đề xuất tự động
  • Sử dụng đầu vào bằng giọng nói (lệnh thoại hoặc đọc chính tả)

Vì vậy, bạn có thể:

Chỉ hạn chế tràn văn bản

Bằng cách xóa các ký tự thừa:

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

Bạn có thể làm điều đó ngay cả khi đang bay ! bằng cách đặt mã này bên trong hành động của textViewhoặc textFieldvới .editingChangedsự kiện.


Đặt này trong UITextView đại biểu của func textViewDidChange(_ textView: UITextView) {...}các tác phẩm đẹp, chỉ cắt phần cuối của một văn bản dài dán
Josselin

2

Mặc dù tôi cần một if-elseđiều kiện, vì vậy điều này phù hợp với tôi:

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

Về cơ bản, nút được đặt thành tắt. Nhưng nếu bạn muốn người dùng không thể đăng thử nghiệm trống, chỉ cần đặt một điều kiện là nhấp vào nút:

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

Vấn đề với một số câu trả lời được đưa ra ở trên là, Ví dụ: tôi có một trường văn bản và tôi phải đặt giới hạn nhập 15 ký tự, sau đó nó sẽ dừng lại sau khi nhập 15 Ký tự. nhưng họ Không cho phép xóa. Đó là nút xóa cũng không hoạt động. Như tôi đã phải đối mặt với cùng một vấn đề. Đưa ra giải pháp, Đưa ra Dưới đây. Hoạt động hoàn hảo cho tôi

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

Tôi đang có một trường văn bản, có thẻ mà tôi đã đặt "6" và tôi đã hạn chế giới hạn ký tự tối đa = 30; hoạt động tốt trong mọi trường hợp


1

Phiên bản Swift của @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

Ở đây chúng tôi đi cho phù hợp nhất. Hiển thị số ký tự còn lại: còn lại 'n' ký tự.

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

Nếu bạn cũng muốn có thể dán mã lên đến số ký tự tối đa, đồng thời loại bỏ phần tràn và cập nhật nhãn số:

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
}

Với phần mở rộng:

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

Thử thứ này đi:-

 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

Viết mã dưới đây trong textView:shouldChangeTextInRange:replacementText:phương thức:

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

Sử dụng mã sau.

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

nếu điều kiện được sử dụng để xóa ký tự từ độ xem văn bản
Vikas Grandhi

0

Đây là giải pháp đơn giản nhất để hạn chế người dùng nhập số lượng ký tự vào UITextFieldhoặc UITextViewtrong iOS nhanh chóng

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

Lưu ý: đây giới hạn có thể được bất cứ điều gì từ 1để ntheo yêu cầu của bạn, cho ví dụ: nếu bạn làm việc vào số điện thoại hơn limitgiá trị sẽ là 10 nếu bạn muốn áp dụng tương tự trên UITextViewchỉ phương pháp sẽ thay đổi và tại địa điểm của textfieldbạn sẽ được sử dụngtextview

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.