Làm cách nào tôi có thể đặt số lượng ký tự tối đa trong UITextField
SDK trên iPhone khi tôi tải lên UIView
?
Làm cách nào tôi có thể đặt số lượng ký tự tối đa trong UITextField
SDK trên iPhone khi tôi tải lên UIView
?
Câu trả lời:
Mặc dù UITextField
lớp không có thuộc tính độ dài tối đa, việc lấy chức năng này tương đối đơn giản bằng cách đặt trường văn bản delegate
và thực hiện phương thức ủy nhiệm sau:
Mục tiêu-C
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// Prevent crashing undo bug – see note below.
if(range.length + range.location > textField.text.length)
{
return NO;
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return newLength <= 25;
}
Nhanh
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let currentCharacterCount = textField.text?.count ?? 0
if range.length + range.location > currentCharacterCount {
return false
}
let newLength = currentCharacterCount + string.count - range.length
return newLength <= 25
}
Trước khi trường văn bản thay đổi, UITextField sẽ hỏi đại biểu nếu văn bản được chỉ định sẽ được thay đổi. Trường văn bản không thay đổi tại thời điểm này, vì vậy chúng tôi lấy chiều dài hiện tại và độ dài chuỗi chúng tôi đang chèn (thông qua việc dán văn bản sao chép hoặc nhập một ký tự bằng bàn phím), trừ đi độ dài phạm vi. Nếu giá trị này quá dài (hơn 25 ký tự trong ví dụ này), hãy quay lại NO
để cấm thay đổi.
Khi nhập một ký tự ở cuối trường văn bản, range.location
sẽ là độ dài của trường hiện tại và range.length
sẽ là 0 vì chúng tôi không thay thế / xóa bất cứ thứ gì. Chèn vào giữa một trường văn bản chỉ có nghĩa là khác nhau range.location
và dán nhiều ký tự chỉ có nghĩa là string
có nhiều hơn một ký tự trong đó.
Xóa các ký tự đơn hoặc cắt nhiều ký tự được chỉ định bởi a range
có độ dài khác không và một chuỗi trống. Thay thế chỉ là một phạm vi xóa với một chuỗi không trống.
Như đã đề cập trong các ý kiến, có một lỗi với UITextField
nó có thể dẫn đến một sự cố.
Nếu bạn dán vào trường, nhưng việc dán bị ngăn cản bởi quá trình xác thực của bạn, thao tác dán vẫn được ghi lại trong bộ đệm hoàn tác của ứng dụng. Nếu sau đó bạn thực hiện hoàn tác (bằng cách lắc thiết bị và xác nhận Hoàn tác), thì UITextField
sẽ cố gắng thay thế chuỗi mà nó nghĩ rằng nó đã dán vào chính nó bằng một chuỗi trống. Điều này sẽ sụp đổ bởi vì nó không bao giờ thực sự dán chuỗi vào chính nó. Nó sẽ cố gắng thay thế một phần của chuỗi không tồn tại.
May mắn thay, bạn có thể bảo vệ UITextField
khỏi tự sát như thế này. Bạn chỉ cần để đảm bảo rằng phạm vi nó đề xuất để thay thế không tồn tại trong chuỗi hiện tại của nó. Đây là những gì kiểm tra vệ sinh ban đầu ở trên làm.
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let str = (textView.text + text)
if str.characters.count <= 10 {
return true
}
textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
return false
}
Hy vọng nó hữu ích cho bạn.
return newLength <= 25;
UITextField
trên iPad iOS 8.1. (+1 để bình luận). Tác giả sẽ thêm một cái gì đó về điều này vì nó là câu trả lời được xếp hạng hàng đầu? Tôi rất vui khi thực hiện chỉnh sửa, nhưng tôi thường xuyên bị từ chối! :-)
import UIKit
private var kAssociationKeyMaxLength: Int = 0
extension UITextField {
@IBInspectable var maxLength: Int {
get {
if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
return length
} else {
return Int.max
}
}
set {
objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
}
}
@objc func checkMaxLength(textField: UITextField) {
guard let prospectiveText = self.text,
prospectiveText.count > maxLength
else {
return
}
let selection = selectedTextRange
let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
let substring = prospectiveText[..<indexEndOfText]
text = String(substring)
selectedTextRange = selection
}
}
Chỉnh sửa: vấn đề rò rỉ bộ nhớ đã được sửa.
Cảm ơn bạn tháng tám! ( Bài )
Đây là mã mà tôi đã kết thúc với nó hoạt động:
#define MAX_LENGTH 20
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.text.length >= MAX_LENGTH && range.length == 0)
{
return NO; // return NO to not change text
}
else
{return YES;}
}
return textField.text.length < MAX_LENGTH || range.length != 0;
Để hoàn thành câu trả lời tháng 8 , có thể thực hiện chức năng được đề xuất (xem đại biểu của UITextField ).
Tôi đã không kiểm tra domness mã, nhưng tôi không gặp khó khăn nếu người dùng đạt đến giới hạn, và nó tương thích với một chuỗi mới mà đến thay thế một nhỏ hơn hoặc bằng.
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//limit the size :
int limit = 20;
return !([textField.text length]>limit && [string length] > range.length);
}
Bạn không thể làm điều này trực tiếp - UITextField
không có thuộc tính maxLạng , nhưng bạn có thể đặt UITextField's
đại biểu, sau đó sử dụng:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Thường thì bạn có nhiều trường đầu vào với độ dài khác nhau.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
int allowedLength;
switch(textField.tag) {
case 1:
allowedLength = MAXLENGTHNAME; // triggered for input fields with tag = 1
break;
case 2:
allowedLength = MAXLENGTHADDRESS; // triggered for input fields with tag = 2
break;
default:
allowedLength = MAXLENGTHDEFAULT; // length default when no tag (=0) value =255
break;
}
if (textField.text.length >= allowedLength && range.length == 0) {
return NO; // Change not allowed
} else {
return YES; // Change allowed
}
}
Cách tốt nhất sẽ là thiết lập một thông báo về việc thay đổi văn bản. Trong -awakeFromNib
phương pháp điều khiển xem của bạn, bạn sẽ muốn:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitTextField:) name:@"UITextFieldTextDidChangeNotification" object:myTextField];
Sau đó, trong cùng một lớp thêm:
- (void)limitTextField:(NSNotification *)note {
int limit = 20;
if ([[myTextField stringValue] length] > limit) {
[myTextField setStringValue:[[myTextField stringValue] substringToIndex:limit]];
}
}
Sau đó liên kết ổ cắm myTextField
với bạn UITextField
và nó sẽ không cho phép bạn thêm bất kỳ ký tự nào sau khi bạn đạt đến giới hạn. Hãy chắc chắn để thêm điều này vào phương thức dealloc của bạn:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:myTextField];
Tôi đã tạo lớp con UITextFieldLimit này :
Lấy UITextFieldLimit.h
và UITextFieldLimit.m
từ kho lưu trữ GitHub này:
https://github.com/JonathanGurebo/UITextFieldLimit
và bắt đầu thử nghiệm!
Đánh dấu UITextField do bảng phân cảnh của bạn tạo và liên kết nó với lớp con của tôi bằng Trình kiểm tra danh tính:
Sau đó, bạn có thể liên kết nó với IBOutlet và đặt giới hạn (mặc định là 10).
Tệp ViewControll.h của bạn phải chứa: (nếu bạn không sửa đổi cài đặt, như giới hạn)
#import "UITextFieldLimit.h"
/.../
@property (weak, nonatomic) IBOutlet UITextFieldLimit *textFieldLimit; // <--Your IBOutlet
Tập tin ViewControll.m của bạn nên @synthesize textFieldLimit
.
Đặt giới hạn độ dài văn bản trong tệp ViewControll.m của bạn:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[textFieldLimit setLimit:25];// <-- and you won't be able to put more than 25 characters in the TextField.
}
Hy vọng lớp học giúp bạn. Chúc may mắn!
Điều này là đủ để giải quyết vấn đề (thay thế 4 bằng giới hạn bạn muốn). Chỉ cần đảm bảo thêm đại biểu trong IB.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
return (newString.length<=4);
}
Sử dụng phần mở rộng bên dưới để đặt độ dài ký tự tối đa của a UITextField
và UITextView
.
Swift 4.0
private var kAssociationKeyMaxLength: Int = 0
private var kAssociationKeyMaxLengthTextView: Int = 0
extension UITextField {
@IBInspectable var maxLength: Int {
get {
if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
return length
} else {
return Int.max
}
}
set {
objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
}
}
@objc func checkMaxLength(textField: UITextField) {
guard let prospectiveText = self.text,
prospectiveText.count > maxLength
else {
return
}
let selection = selectedTextRange
let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
let substring = prospectiveText[..<indexEndOfText]
text = String(substring)
selectedTextRange = selection
}
}
extension UITextView:UITextViewDelegate {
@IBInspectable var maxLength: Int {
get {
if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLengthTextView) as? Int {
return length
} else {
return Int.max
}
}
set {
self.delegate = self
objc_setAssociatedObject(self, &kAssociationKeyMaxLengthTextView, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
public func textViewDidChange(_ textView: UITextView) {
checkMaxLength(textField: self)
}
@objc func checkMaxLength(textField: UITextView) {
guard let prospectiveText = self.text,
prospectiveText.count > maxLength
else {
return
}
let selection = selectedTextRange
let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
let substring = prospectiveText[..<indexEndOfText]
text = String(substring)
selectedTextRange = selection
}
}
Bạn có thể đặt giới hạn dưới đây.
Tôi mô phỏng sự thay thế chuỗi thực tế sắp xảy ra để tính toán độ dài của chuỗi tương lai đó:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if([newString length] > maxLength)
return NO;
return YES;
}
Phiên bản Swift 3 // ***** Điều này sẽ KHÔNG hoạt động với Swift 2.x! ***** //
Đầu tiên tạo một tệp Swift mới: TextFieldMaxL wavel.swift, sau đó thêm mã dưới đây:
import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let length = maxLengths[self]
else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
addTarget(
self,
action: #selector(limitLength),
for: UIControlEvents.editingChanged
)
}
}
func limitLength(textField: UITextField) {
guard let prospectiveText = textField.text,
prospectiveText.characters.count > maxLength
else {
return
}
let selection = selectedTextRange
let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
text = prospectiveText.substring(to: maxCharIndex)
selectedTextRange = selection
}
}
và sau đó bạn sẽ thấy trong Storyboard một trường mới (Độ dài tối đa) khi bạn chọn bất kỳ TextField nào
nếu bạn vẫn còn nhiều câu hỏi, hãy xem liên kết này: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -maximum-length-visual-studio-style /
Sử dụng Trình xây dựng giao diện, bạn có thể liên kết và nhận sự kiện cho "Chỉnh sửa đã thay đổi" trong bất kỳ chức năng nào của bạn. Bây giờ bạn có thể đặt kiểm tra độ dài
- (IBAction)onValueChange:(id)sender
{
NSString *text = nil;
int MAX_LENGTH = 20;
switch ([sender tag] )
{
case 1:
{
text = myEditField.text;
if (MAX_LENGTH < [text length]) {
myEditField.text = [text substringToIndex:MAX_LENGTH];
}
}
break;
default:
break;
}
}
Đoạn mã sau tương tự như câu trả lời của bệnh nhân nhưng xử lý các thao tác sao chép-dán chính xác. Nếu bạn cố gắng dán một văn bản dài hơn giới hạn, đoạn mã sau sẽ cắt bớt văn bản để phù hợp với giới hạn thay vì từ chối hoàn toàn thao tác dán.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
static const NSUInteger limit = 70; // we limit to 70 characters
NSUInteger allowedLength = limit - [textField.text length] + range.length;
if (string.length > allowedLength) {
if (string.length > 1) {
// get at least the part of the new string that fits
NSString *limitedString = [string substringToIndex:allowedLength];
NSMutableString *newString = [textField.text mutableCopy];
[newString replaceCharactersInRange:range withString:limitedString];
textField.text = newString;
}
return NO;
} else {
return YES;
}
}
Có giải pháp chung để thiết lập độ dài tối đa trong Swift. Bằng IBInspectable, bạn có thể thêm Thuộc tính mới trong Trình kiểm tra thuộc tính Xcode.
import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let length = maxLengths[self]
else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
addTarget(
self,
action: Selector("limitLength:"),
forControlEvents: UIControlEvents.EditingChanged
)
}
}
func limitLength(textField: UITextField) {
guard let prospectiveText = textField.text
where prospectiveText.characters.count > maxLength else {
return
}
let selection = selectedTextRange
text = prospectiveText.substringWithRange(
Range<String.Index>(prospectiveText.startIndex ..< prospectiveText.startIndex.advancedBy(maxLength))
)
selectedTextRange = selection
}
}
Để làm cho nó hoạt động với việc cắt và dán các chuỗi có độ dài bất kỳ, tôi khuyên bạn nên thay đổi chức năng thành một cái gì đó như:
#define MAX_LENGTH 20
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSInteger insertDelta = string.length - range.length;
if (textField.text.length + insertDelta > MAX_LENGTH)
{
return NO; // the new string would be longer than MAX_LENGTH
}
else {
return YES;
}
}
Swift 4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.count + string.count - range.length
return newLength <= 10
}
guard
?
Swift 2.0 +
Trước hết tạo một lớp cho quá trình này. Hãy gọi nó là StringValidator.swift.
Sau đó chỉ cần dán đoạn mã sau vào bên trong nó.
import Foundation
extension String {
func containsCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) != nil
}
func containsOnlyCharactersIn(matchCharacters: String) -> Bool {
let disallowedCharacterSet = NSCharacterSet(charactersInString: matchCharacters).invertedSet
return self.rangeOfCharacterFromSet(disallowedCharacterSet) == nil
}
func doesNotContainCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) == nil
}
func isNumeric() -> Bool
{
let scanner = NSScanner(string: self)
scanner.locale = NSLocale.currentLocale()
return scanner.scanDecimal(nil) && scanner.atEnd
}
}
Bây giờ lưu lớp .....
Sử dụng..
Bây giờ, hãy xem lớp viewControll.swift của bạn và đặt các cửa hàng của trường văn bản của bạn là ..
@IBOutlet weak var contactEntryTxtFld: UITextField! //First textfield
@IBOutlet weak var contactEntryTxtFld2: UITextField! //Second textfield
Bây giờ, hãy chọn phương thức ShouldChangeChar characterInRange của textfield và sử dụng như sau.
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if string.characters.count == 0 {
return true
}
let latestText = textField.text ?? ""
let checkAbleText = (latestText as NSString).stringByReplacingCharactersInRange(range, withString: string)
switch textField {
case contactEntryTxtFld:
return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5
case contactEntryTxtFld2:
return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5
default:
return true
}
}
Đừng quên thiết lập giao thức / phương thức của trường văn bản.
Hãy để tôi giải thích về điều này ... Tôi đang sử dụng quy trình mở rộng đơn giản của chuỗi mà tôi đã viết bên trong một lớp khác. Bây giờ tôi chỉ gọi các phương thức mở rộng đó từ một lớp khác mà tôi cần chúng bằng cách thêm kiểm tra và giá trị tối đa.
Đặc trưng...
Các loại ...
chứaOnlyChar characterIn // Chỉ chấp nhận các ký tự.
chứaChar characterIn // Chấp nhận kết hợp các ký tự
doesNotContainsChar characterIn // Sẽ không chấp nhận các ký tự
Hy vọng điều này đã giúp .... Cảm ơn ..
Mã này hoạt động tốt khi bạn dán chuỗi nhiều hơn giới hạn ký tự của bạn.
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let str = (textView.text + text)
if str.characters.count <= 10 {
return true
}
textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
return false
}
Cảm ơn bạn đã bình chọn. :)
Tôi đưa ra một câu trả lời bổ sung dựa trên @Frouo. Tôi nghĩ rằng câu trả lời của anh ấy là cách đẹp nhất. Vì nó là một điều khiển chung mà chúng ta có thể sử dụng lại.
private var kAssociationKeyMaxLength: Int = 0
extension UITextField {
@IBInspectable var maxLength: Int {
get {
if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
return length
} else {
return Int.max
}
}
set {
objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
self.addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
}
}
func checkMaxLength(textField: UITextField) {
guard !self.isInputMethod(), let prospectiveText = self.text,
prospectiveText.count > maxLength
else {
return
}
let selection = selectedTextRange
let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
text = prospectiveText.substring(to: maxCharIndex)
selectedTextRange = selection
}
//The method is used to cancel the check when use Chinese Pinyin input method.
//Becuase the alphabet also appears in the textfield when inputting, we should cancel the check.
func isInputMethod() -> Bool {
if let positionRange = self.markedTextRange {
if let _ = self.position(from: positionRange.start, offset: 0) {
return true
}
}
return false
}
}
Đây là cách chính xác để xử lý độ dài tối đa trên UITextField, nó cho phép phím quay lại thoát khỏi trường văn bản dưới dạng phản hồi đầu tiên và cho phép người dùng lùi lại khi đạt đến giới hạn
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
int MAX_LENGHT = 5;
if([string isEqualToString:@"\n"])
{
[textField resignFirstResponder];
return FALSE;
}
else if(textField.text.length > MAX_LENGHT-1)
{
if([string isEqualToString:@""] && range.length == 1)
{
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return TRUE;
}
}
Điều gì về phương pháp đơn giản này. Nó làm việc tốt cho tôi.
extension UITextField {
func charactersLimit(to:Int) {
if (self.text!.count > to) {
self.deleteBackward()
}
}
}
Sau đó:
someTextField.charactersLimit(to:16)
Các câu trả lời khác không xử lý trường hợp người dùng có thể dán một chuỗi dài từ clipboard. Nếu tôi dán một chuỗi dài, nó sẽ bị cắt ngắn nhưng được hiển thị. Sử dụng điều này trong đại biểu của bạn:
static const NSUInteger maxNoOfCharacters = 5;
-(IBAction)textdidChange:(UITextField * )textField
{
NSString * text = textField.text;
if(text.length > maxNoOfCharacters)
{
text = [text substringWithRange:NSMakeRange(0, maxNoOfCharacters)];
textField.text = text;
}
// use 'text'
}
Có nó xuống 1 dòng mã :)
Đặt đại biểu xem văn bản của bạn để "tự" sau đó thêm <UITextViewDelegate>
trong .h của bạn và đoạn mã sau vào .m của bạn .... bạn có thể điều chỉnh số "7" là bất cứ điều gì bạn muốn số lượng tối đa của bạn của nhân vật được.
-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
return ((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length)>0);
}
Mã này chiếm tài khoản để gõ các ký tự mới, xóa các ký tự, chọn các ký tự sau đó nhập hoặc xóa, chọn các ký tự và cắt, dán nói chung, và chọn các ký tự và dán.
Làm xong!
Ngoài ra, một cách thú vị khác để viết mã này với các thao tác bit sẽ là
-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
return 0^((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length));
}
Tôi đã mở một lớp con UITextField, STATextField , cung cấp chức năng này (và nhiều hơn nữa) với thuộc tính của nó maxCharacterLength
.
Bây giờ có bao nhiêu ký tự bạn muốn chỉ đưa ra giá trị
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 25) ? NO : YES;
}
Sử dụng mã này tại đây RESTRICTED_LENGTH là độ dài bạn muốn hạn chế cho trường văn bản.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == nameTF) {
int limit = RESTRICTED_LENGTH - 1;
return !([textField.text length]>limit && [string length] > range.length);
}
else
{
return YES;
}
return NO;
}
Tôi đã làm điều này trong Swift với giới hạn 8 ký tự khi sử dụng bàn phím số.
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return !(textField.text?.characters.count == MAX_LENGTH && string != "")
}
Tôi đã phải kiểm tra chuỗi! = "" Để cho phép nút xóa hoạt động trên bàn phím số, nếu không, nó sẽ không cho phép xóa các ký tự trong trường văn bản sau khi đạt đến mức tối đa.
Tôi đã thực hiện một mở rộng UITextField để thêm một tài sản maxLength với nó.
Nó dựa trên Xcode 6 IBInspectables, vì vậy bạn có thể đặt giới hạn tối đa cho trình tạo Giao diện.
Đây là cách thực hiện:
UITextField + MaxLạng.h
#import <UIKit/UIKit.h>
@interface UITextField_MaxLength : UITextField<UITextFieldDelegate>
@property (nonatomic)IBInspectable int textMaxLength;
@end
UITextField + MaxLpm.m
#import "UITextField+MaxLength.h"
@interface UITextField_MaxLength()
@property (nonatomic, assign) id <UITextFieldDelegate> superDelegate;
@end
@implementation UITextField_MaxLength
- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//validate the length, only if it's set to a non zero value
if (self.textMaxLength>0) {
if(range.length + range.location > textField.text.length)
return NO;
if (textField.text.length+string.length - range.length>self.textMaxLength) {
return NO;
}
}
//if length validation was passed, query the super class to see if the delegate method is implemented there
if (self.superDelegate && [self.superDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
return [self.superDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
}
else{
//if the super class does not implement the delegate method, simply return YES as the length validation was passed
return YES;
}
}
- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
if (delegate == self)
return;
self.superDelegate = delegate;
[super setDelegate:self];
}
//forward all non overriden delegate methods
- (id)forwardingTargetForSelector:(SEL)aSelector {
if ([self.superDelegate respondsToSelector:aSelector])
return self.superDelegate;
return [super forwardingTargetForSelector:aSelector];
}
- (BOOL)respondsToSelector:(SEL)aSelector {
if ([self.superDelegate respondsToSelector:aSelector])
return YES;
return [super respondsToSelector:aSelector];
}
@end