আমি UITextField
যখন লোড আপ করি তখন আমি আইফোন এসডিকে একটিতে সর্বাধিক পরিমাণের অক্ষর কীভাবে সেট করতে পারি UIView
?
আমি UITextField
যখন লোড আপ করি তখন আমি আইফোন এসডিকে একটিতে সর্বাধিক পরিমাণের অক্ষর কীভাবে সেট করতে পারি UIView
?
উত্তর:
যদিও UITextField
শ্রেণীর কোনও সর্বোচ্চ দৈর্ঘ্যের সম্পত্তি নেই তবে পাঠ্য ক্ষেত্রটি সেট করে delegate
এবং নিম্নলিখিত প্রতিনিধি পদ্ধতিটি প্রয়োগ করে এই কার্যকারিতাটি পাওয়া তুলনামূলক সহজ :
উদ্দেশ্য গ
- (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;
}
দ্রুতগতি
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
}
পাঠ্য ক্ষেত্র পরিবর্তনের আগে, ইউআইটিেক্সটফিল্ড প্রতিনিধিটিকে জিজ্ঞাসা করে যে নির্দিষ্ট পাঠ্যটি পরিবর্তন করা উচিত । পাঠ্য ক্ষেত্রটি এই মুহুর্তে পরিবর্তিত হয়নি, সুতরাং এটির বর্তমান দৈর্ঘ্য এবং আমরা সন্নিবেশ করানো স্ট্রিংয়ের দৈর্ঘ্য (কপিরাইটযুক্ত টেক্সট পেস্ট করার মাধ্যমে বা কীবোর্ডটি ব্যবহার করে একটি অক্ষর টাইপ করার মাধ্যমে) ব্যাপ্তি বিয়োগের দৈর্ঘ্যটি বিয়োগ করবে। যদি এই মানটি খুব দীর্ঘ হয় (এই উদাহরণে 25 টিরও বেশি অক্ষর), ফিরে আসুনNO
পরিবর্তনটি নিষিদ্ধ করতে আসুন।
পাঠ্য ক্ষেত্রের শেষে একটি একক অক্ষরে টাইপ করার সময়, range.location
বর্তমান ক্ষেত্রের দৈর্ঘ্য range.length
হবে এবং 0 হবে কারণ আমরা কোনও কিছুই প্রতিস্থাপন / মোছা করছি না। একটি পাঠ্য ক্ষেত্রের মাঝখানে সন্নিবেশ করানোর অর্থ অন্যরকম range.location
, এবং একাধিক অক্ষর পেস্ট করার অর্থ string
এর মধ্যে একাধিক অক্ষর থাকে।
একক অক্ষর মুছে ফেলা বা একাধিক অক্ষর কাটা একটি দ্বারা নির্দিষ্ট করা হয় range
শূন্যহীন দৈর্ঘ্যের এবং একটি খালি স্ট্রিং সহ একটি । প্রতিস্থাপনটি খালি নয় খালি স্ট্রিং সহ কেবল একটি পরিসীমা মুছে ফেলা।
মন্তব্যে যেমন উল্লেখ করা হয়েছে, সেখানে একটি বাগ রয়েছে UITextField
যা ক্রাশ হতে পারে।
আপনি যদি ক্ষেত্রটিতে পেস্ট করেন তবে আপনার বৈধতা প্রয়োগের মাধ্যমে পেস্টটি আটকা যায় তবে পেস্ট ক্রিয়াকলাপটি এখনও অ্যাপ্লিকেশনটির পূর্ববর্তী বাফারে রেকর্ড করা আছে। তারপরে আপনি যদি কোনও পূর্বাবস্থায় ফায়ার করেন (ডিভাইসটি কাঁপিয়ে এবং পূর্বাবস্থার বিষয়টি নিশ্চিত করে), তবে খালি স্ট্রিং দিয়ে নিজের মধ্যে এটি আটকে দিয়েছে UITextField
বলে মনে করে সেই স্ট্রিংটি প্রতিস্থাপনের চেষ্টা করবে । কারণ এটি কখনই এই বিপর্যস্ত হবে আসলে নিজেই মধ্যে স্ট্রিং আটকানো হয়েছে। এটি স্ট্রিংয়ের এমন একটি অংশ প্রতিস্থাপনের চেষ্টা করবে যা বিদ্যমান নেই।
ভাগ্যক্রমে আপনি UITextField
নিজেকে এ জাতীয় হত্যা থেকে রক্ষা করতে পারেন । আপনি শুধু তা নিশ্চিত করার জন্য পরিসীমা এটি প্রতিস্থাপন করতে প্রস্তাব প্রয়োজন নেই তার বর্তমান স্ট্রিং মধ্যে বিদ্যমান। উপরের প্রাথমিক স্যানিটি চেক এটি করে।
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
}
আশা করি এটি আপনার পক্ষে সহায়ক।
return newLength <= 25;
UITextField
আইপ্যাড আইওএস 8.1 এর সাথে পরীক্ষিত । (মন্তব্য করতে +1)। এটি শীর্ষ রেটিং উত্তর হিসাবে লেখক এই সম্পর্কে কিছু যুক্ত করতে চান? আমি একটি সম্পাদনা করতে পেরে খুশি, তবে আমার নিয়মিত প্রত্যাখ্যাত বলে মনে হচ্ছে! :-)
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
}
}
সম্পাদনা: মেমরি ফাঁস ইস্যু স্থির।
আপনাকে ধন্যবাদ আগস্ট! ( পোস্ট )
এটি কোড যা আমি শেষ করেছি যা দিয়ে কাজ করে:
#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;
আগস্টের উত্তরটি সম্পূর্ণ করার জন্য, প্রস্তাবিত কার্যটির একটি সম্ভাব্য বাস্তবায়ন ( ইউআইটিেক্সটফিল্ডের প্রতিনিধি দেখুন )।
আমি আধিপত্য কোড পরীক্ষা করিনি , তবে ব্যবহারকারীর সীমাতে পৌঁছে গেলে আমার আটকা পড়ে না, এবং এটি একটি নতুন স্ট্রিংয়ের সাথে সামঞ্জস্যপূর্ণ যা আসে ছোট বা সমান কোডটি প্রতিস্থাপন করে।
-(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);
}
আপনি সরাসরি UITextField
এটি করতে পারবেন না - কোনও সর্বোচ্চ দৈর্ঘ্যের কোনও বৈশিষ্ট্য নেই, তবে আপনি UITextField's
প্রতিনিধি সেট করতে পারেন , তারপরে ব্যবহার করুন:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
প্রায়শই আপনার বিভিন্ন দৈর্ঘ্যের একাধিক ইনপুট ক্ষেত্র থাকে।
- (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
}
}
সর্বোত্তম উপায় হ'ল পাঠ্য পরিবর্তনের বিষয়ে একটি বিজ্ঞপ্তি স্থাপন করা। আপনার -awakeFromNib
নিজের দেখার নিয়ন্ত্রক পদ্ধতিতে আপনি চাইবেন:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitTextField:) name:@"UITextFieldTextDidChangeNotification" object:myTextField];
তারপরে একই শ্রেণিতে যুক্ত করুন:
- (void)limitTextField:(NSNotification *)note {
int limit = 20;
if ([[myTextField stringValue] length] > limit) {
[myTextField setStringValue:[[myTextField stringValue] substringToIndex:limit]];
}
}
তারপরে myTextField
আপনার আউটলেটটিকে লিঙ্ক আপ করুন UITextField
এবং সীমাটি আঘাতের পরে এটি আপনাকে আর কোনও অক্ষর যুক্ত করতে দেয় না। আপনার ডেলোক পদ্ধতিতে এটি যুক্ত করার বিষয়ে নিশ্চিত হন:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:myTextField];
আমি এই ইউআইটিেক্সটফিল্ড লিমিট সাবক্লাসটি তৈরি করেছি :
দখল UITextFieldLimit.h
এবং UITextFieldLimit.m
এই GitHub সংগ্রহস্থল থেকে:
https://github.com/JonathanGurebo/UITextFieldLimit
এবং পরীক্ষা শুরু!
আপনার স্টোরিবোর্ডে তৈরি ইউআইটিেক্সটফিল্ডটি চিহ্নিত করুন এবং সনাক্তকরণ পরিদর্শকটি ব্যবহার করে এটি আমার সাবক্লাসে লিঙ্ক করুন:
তারপরে আপনি এটিকে একটি আইবিউলেটলে লিঙ্ক করতে পারেন এবং সীমাটি সেট করতে পারেন (ডিফল্টটি 10)।
আপনার ভিউকন্ট্রোল.আর ফাইলটিতে এমন হওয়া উচিত: (আপনি যদি সীমাটির মতো সেটিংটি পরিবর্তন করতে চান না)
#import "UITextFieldLimit.h"
/.../
@property (weak, nonatomic) IBOutlet UITextFieldLimit *textFieldLimit; // <--Your IBOutlet
আপনার ভিউকন্ট্রোলআরএম ফাইলটি করা উচিত @synthesize textFieldLimit
।
আপনার ভিউকন্ট্রোলআরএম ফাইলটিতে পাঠ্যের দৈর্ঘ্যের সীমাটি সেট করুন:
- (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.
}
আশা করি শ্রেণি আপনাকে সহায়তা করবে। শুভকামনা!
সমস্যাটি সমাধান করার জন্য এটি পর্যাপ্ত হওয়া উচিত (আপনার সীমা দ্বারা 4 টি প্রতিস্থাপন করুন)। কেবল আইবিতে প্রতিনিধি যুক্ত করার বিষয়টি নিশ্চিত করুন।
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
return (newString.length<=4);
}
একটি UITextField
এবং সর্বাধিক অক্ষরের দৈর্ঘ্য সেট করতে নীচে এক্সটেনশনটি ব্যবহার করুন UITextView
।
সুইফট 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
}
}
আপনি নীচে সীমা নির্ধারণ করতে পারেন।
ভবিষ্যতের স্ট্রিংয়ের দৈর্ঘ্য গণনা করার জন্য আমি আসল স্ট্রিং প্রতিস্থাপনটি অনুকরণ করি:
- (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;
}
সুইফট 3 সংস্করণ // ***** এটি সুইফট 2.x এর সাথে কাজ করবে না! ***** //
প্রথমে একটি নতুন সুইফ্ট ফাইল তৈরি করুন: টেক্সটফিল্ডম্যাক্সেলেন্থ.সুইফ্ট এবং তারপরে নীচের কোডটি যুক্ত করুন:
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
}
}
এবং তারপরে আপনি কোনও পাঠ্য ফিল্ড নির্বাচন করার পরে স্টোরিবোর্ডে একটি নতুন ক্ষেত্র (সর্বোচ্চ দৈর্ঘ্য) দেখতে পাবেন
আপনার যদি এখনও আরও প্রশ্ন থাকে তবে এই লিঙ্কটি দেখুন: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -maximum দৈর্ঘ্যের ভিজুয়াল-স্টুডিওতে-শৈলী /
ইন্টারফেস বিল্ডার ব্যবহার করে আপনি লিঙ্ক করতে পারেন এবং আপনার যে কোনও ফাংশনে "সম্পাদনা পরিবর্তিত" এর ইভেন্টটি পেতে পারেন। এখন সেখানে আপনি দৈর্ঘ্যের জন্য পরীক্ষা করতে পারেন
- (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;
}
}
নিম্নলিখিত কোডটি সিপ্পের উত্তরের মতো তবে সঠিকভাবে অনুলিপি-অনুলিপি পরিচালনা করে। আপনি যদি সীমাটির চেয়ে দীর্ঘতর কোনও পাঠ্য আটকে দেওয়ার চেষ্টা করেন তবে নীচের কোডটি পুরোপুরি পেস্ট অপারেশনটিকে প্রত্যাখ্যান করার পরিবর্তে সীমাতে ফিট করার জন্য পাঠ্যটি কেটে যাবে।
- (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;
}
}
নেই জেনেরিক সমাধান সুইফট মধ্যে সর্বোচ্চ দৈর্ঘ্য সেট করার জন্য। আইবিআই স্পেসটেবল দ্বারা আপনি এক্সকোড অ্যাট্রিবিউট ইন্সপেক্টরটিতে নতুন অ্যাট্রিবিউট যুক্ত করতে পারেন।
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
}
}
এটিকে যে কোনও দৈর্ঘ্যের স্ট্রিংগুলি কাটা ও পেস্ট দিয়ে কাজ করতে, আমি ফাংশনটি এমন কিছুতে পরিবর্তনের পরামর্শ দিচ্ছি:
#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;
}
}
সুইফট 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
?
সুইফট ২.০ +
সবার আগে এই প্রক্রিয়াটির জন্য একটি শ্রেণি তৈরি করুন। একে স্ট্রিংভালিডেটর.সুইফ্ট বলি।
তারপরে নীচের কোডটি কেবল তার ভিতরে পেস্ট করুন।
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
}
}
এখন ক্লাস বাঁচাও .....
ব্যবহারের ..
এখন আপনার ভিউকন্ট্রোলআরউইউফ্ট ক্লাসে যান এবং আপনার পাঠ্যক্ষেত্রের আউটলেটগুলি হিসাবে করুন ..
@IBOutlet weak var contactEntryTxtFld: UITextField! //First textfield
@IBOutlet weak var contactEntryTxtFld2: UITextField! //Second textfield
এখন টেক্সটফিল্ডের কাঁধে চ্যাটারসআইন্টাররেজ পদ্ধতিটি ব্যবহার করুন এবং নীচের মত ব্যবহার করুন।
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
}
}
পাঠ্যক্ষেত্রের প্রতিনিধি প্রোটোকল / পদ্ধতিগুলি সেট করতে ভুলবেন না।
আমাকে এ সম্পর্কে ব্যাখ্যা করতে দাও ... আমি স্ট্রিংয়ের সরল এক্সটেনশন প্রক্রিয়াটি ব্যবহার করছি যা আমি অন্য শ্রেণীর ভিতরে লিখেছিলাম। এখন আমি কেবলমাত্র অন্য ক্লাস থেকে এই এক্সটেনশন পদ্ধতিগুলিতে কল করছি যেখানে আমার চেক এবং সর্বাধিক মান যুক্ত করে তাদের প্রয়োজন।
বৈশিষ্ট্য ...
প্রকারভেদ ...
কেবলমাত্র অক্ষরগুলিতেই রয়েছে // কেবলমাত্র অক্ষর গ্রহণ করে।
ক্যারাকটারস ইন // অক্ষরের সংমিশ্রণ গ্রহণ করে
doNotContainsCharactersIn // অক্ষর গ্রহণ করবে না
আশা করি এটি সাহায্য করেছে .... ধন্যবাদ ..
আপনি যখন অক্ষর সীমা চেয়ে বেশি স্ট্রিং পেস্ট করছেন তখন এই কোডটি ঠিকঠাক কাজ করছে।
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
}
আপনার ভোটের জন্য ধন্যবাদ :)
আমি @ ফ্রুওয়ের উপর ভিত্তি করে একটি পরিপূরক উত্তর দিচ্ছি। আমি মনে করি তার উত্তরটি সবচেয়ে সুন্দর উপায়। এটি পুনরায় ব্যবহার করতে পারি এটি একটি সাধারণ নিয়ন্ত্রণ বেক করুন।
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
}
}
এটি ইউআইটিেক্সটফিল্ডে সর্বোচ্চ দৈর্ঘ্য হ্যান্ডেল করার সঠিক উপায়, এটি রিটার্ন কীটি প্রথম প্রতিক্রিয়াকারী হিসাবে পাঠ্যক্ষেত্র থেকে পদত্যাগ করতে অনুমতি দেয় এবং ব্যবহারকারী যখন সীমাতে পৌঁছে তখন ব্যাকস্পেসকে দেয়
- (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;
}
}
এই সহজ পদ্ধতির সম্পর্কে কি। এটা আমার জন্য কাজ করে।
extension UITextField {
func charactersLimit(to:Int) {
if (self.text!.count > to) {
self.deleteBackward()
}
}
}
তারপর:
someTextField.charactersLimit(to:16)
অন্যান্য উত্তরগুলি ক্ষেত্রে হ্যান্ডেল করে না যেখানে ব্যবহারকারীরা ক্লিপবোর্ড থেকে দীর্ঘ স্ট্রিং পেস্ট করতে পারে। যদি আমি একটি দীর্ঘ স্ট্রিং পেস্ট করি তবে এটি কেবল ছাঁটাই করা উচিত তবে প্রদর্শিত হবে। আপনার প্রতিনিধি এটি ব্যবহার করুন:
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'
}
কোডের 1 লাইনে নামিয়েছেন :)
আপনার পাঠ্য দর্শনের প্রতিনিধিটিকে "স্ব" হিসাবে সেট করুন তারপরে <UITextViewDelegate>
আপনার .h এ নীচের কোডটি যুক্ত করুন এবং আপনার মি। মি .... আপনি "7" নম্বরটি আপনার ম্যাক্সিমামের অক্ষরের সংখ্যাটি যা চান তা সমন্বয় করতে পারেন।
-(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);
}
এই কোডটি নতুন অক্ষরগুলি টাইপ করার জন্য, অক্ষরগুলি মুছে ফেলার জন্য, অক্ষর নির্বাচন করে টাইপ করতে বা মুছতে, অক্ষর নির্বাচন করতে এবং কাটতে, সাধারণভাবে আটকানোতে এবং অক্ষর নির্বাচন করে এবং পেস্ট করার জন্য অ্যাকাউন্ট করে।
সম্পন্ন!
বিকল্পভাবে, বিট-অপারেশন সহ এই কোডটি লেখার আরও দুর্দান্ত উপায়
-(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));
}
এখন আপনি কতগুলি অক্ষর চান মান দিতে চান
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 25) ? NO : YES;
}
এই কোডটি এখানে ব্যবহার করুন RESTRICTED_LENGTH দৈর্ঘ্য আপনি পাঠ্যক্ষেত্রের জন্য সীমাবদ্ধ রাখতে চান।
- (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;
}
নম্বর প্যাড ব্যবহার করার সময় আমি সুইফটে 8 টি অক্ষরের সীমাতে এটি করেছি।
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return !(textField.text?.characters.count == MAX_LENGTH && string != "")
}
স্ট্রিংয়ের জন্য আমাকে পরীক্ষা করতে হয়েছিল! = "" মুছে ফেলা বোতামটি নম্বর প্যাডে কাজ করার অনুমতি দেওয়ার জন্য, অন্যথায় এটি পাঠ্য ক্ষেত্রের অক্ষর সর্বাধিকতায় পৌঁছানোর পরে অনুমতি দেবে না।
আমি এটিতে সর্বাধিক দৈর্ঘ্যের সম্পত্তি যুক্ত করতে একটি ইউআইটিেক্সটফিল্ড এক্সটেনশন প্রয়োগ করেছি।
এটি এক্সকোড 6 আইবিআইস্পেসটেবলের উপর ভিত্তি করে, যাতে আপনি ইন্টারফেস বিল্ডারে সর্বোচ্চ দৈর্ঘ্য সীমাটি সেট করতে পারেন।
বাস্তবায়ন এখানে:
UITextField + + MaxLength.h
#import <UIKit/UIKit.h>
@interface UITextField_MaxLength : UITextField<UITextFieldDelegate>
@property (nonatomic)IBInspectable int textMaxLength;
@end
UITextField + + MaxLength.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