84

文字列をツイートするためのテキストビューを提供しています。

次の方法を適用して、文字数を140文字に制限しています。

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

バックスペースが機能していないという最初の条件を除いて、コードはうまく機能しています。メソッドがfalseを返し、ユーザーがそれ以上文字を挿入できないように、140文字の制限に達したと仮定しますが、その後、一部の文字を削除しようとすると、テキストビューは無効になっているように動作します。

したがって、問題は、「テキストビューから文字を削除する方法、textview.textまたはテキストビューを再度有効にする方法」です。

4

18 に答える 18

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

これは、ユーザーがテキストを切り取ったり、1文字より長い文字列を削除したり(つまり、選択してバックスペースを押した場合)、範囲を強調表示してそれより短いまたは長い文字列を貼り付けたりすることを考慮しています。

Swift4.0バージョン

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return textView.text.count + (text.count - range.length) <= 140
}
于 2010-11-27T00:26:16.357 に答える
68

アップルのリファレンスにあるように、代わりに空の文字列を探す必要があります

ユーザーがDeleteキーを押すと、範囲の長さは1になり、空の文字列オブジェクトがその1文字に置き換わります。

実際に作成したいチェックは[[textView text] length] - range.length + text.length > 140、カットアンドペースト操作を説明するためのようなものだと思います。

于 2010-03-22T12:50:09.617 に答える
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
}
于 2017-12-22T07:28:46.147 に答える
10

ただし、以下の作業コードも使用できます。

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

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

    if([[textView text] length] > restrictedLength){
        textView.text=[temp substringToIndex:[temp length]-1];
    }
}
于 2011-09-05T13:11:20.260 に答える
8

テキスト全体ではなく、オーバーフローを制限してください。

デリゲートメソッドに戻るfalseと、...shouldChangeTextInRange...実際にはテキスト全体が制限され、次の状況の処理が非常に困難になる可能性があります。

  • コピーして貼り付ける
  • テキストの領域を選択して編集します
  • 自動提案を使用する
  • 音声入力(音声コマンドまたはディクテーション)の使用

だからあなたはできる:

テキストのオーバーフローを制限するだけです!

余分な文字を削除することによって:

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

その場でもできます!このコードを、またはイベントとともにのアクション内に配置します。textViewtextField.editingChanged

于 2019-10-22T15:52:02.923 に答える
7

Swift5とiOS12では、プロトコル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
}
  • このコードの最も重要な部分は、()から(rangeNSRangeへの変換です。この変換が重要である理由を理解するには、このビデオチュートリアルを参照してください。rangeOfTextToReplaceRange<String.Index>
  • このコードを正しく機能させるには、textFieldsmartInsertDeleteType値もに設定する必要がありますUITextSmartInsertDeleteType.no。これにより、貼り付け操作を実行するときに(不要な)余分なスペースが挿入されるのを防ぐことができます。

textView(_:shouldChangeTextIn:replacementText:)以下の完全なサンプルコードは、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
    }

}
于 2019-03-19T23:05:02.813 に答える
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;
}
于 2014-12-03T08:22:55.160 に答える
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文字しか入力できず、必要に応じて削除できます

于 2011-09-05T13:19:56.557 に答える
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
}
于 2015-04-12T11:21:09.587 に答える
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に制限したテキストフィールドがあります。すべての場合に正常に動作します

于 2014-03-21T14:38:36.003 に答える
1

@Tim Gostonyの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;
}
于 2015-08-24T18:47:48.510 に答える
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
}
于 2015-11-16T23:19:18.947 に答える
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
}
于 2016-08-16T10:54:02.630 に答える
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
    }
}
于 2018-11-08T20:15:04.817 に答える
0

メソッドに以下のコードを記述しますtextView:shouldChangeTextInRange:replacementText:

if ([textView.text length]>=3 && ![text isEqualToString:@""]) {
    return NO;
}
return YES;
于 2014-06-21T16:14:45.573 に答える
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;
    }
}
于 2014-09-12T10:22:47.493 に答える
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
}
于 2020-05-18T21:28:45.810 に答える
0

これは、ユーザーがiOSSwiftUITextFieldに文字数を入力することを制限するための最も簡単なソリューションです。UITextView

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

注:ここでの制限は、要件に応じてから1までのいずれかになりnます。たとえば、電話番号で作業している場合はlimit値よりも10 適用したい場合は、UITextView方法が変更され、textfieldあなたの場所で使用されますtextview

于 2020-10-08T11:01:14.580 に答える