আমি জানি যে আমি কীবোর্ডটি খারিজ করতে চাইলে আমার ইউআইটিেক্সটফিল্ডকে প্রথম প্রতিক্রিয়াশীলকে পদত্যাগ করতে বলি, তবে কী-বোর্ড কীভাবে "সম্পন্ন" কী টিপেছে তা কীভাবে জানতে হবে তা আমি নিশ্চিত নই। আমি কি বিজ্ঞপ্তি দেখতে পারি?
আমি জানি যে আমি কীবোর্ডটি খারিজ করতে চাইলে আমার ইউআইটিেক্সটফিল্ডকে প্রথম প্রতিক্রিয়াশীলকে পদত্যাগ করতে বলি, তবে কী-বোর্ড কীভাবে "সম্পন্ন" কী টিপেছে তা কীভাবে জানতে হবে তা আমি নিশ্চিত নই। আমি কি বিজ্ঞপ্তি দেখতে পারি?
উত্তর:
আমি UITextField
আমার ViewController
ক্লাসে এর প্রতিনিধি সেট ।
এই শ্রেণিতে আমি এই পদ্ধতিটি নিম্নলিখিত হিসাবে প্রয়োগ করেছি:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
NO
পরিবর্তে ফিরে আসবে কেন YES
?
NO
আপনি পাঠ্যে একটি লাইন ফিরে যুক্ত এড়াতে পারবেন।
আপনি যদি পাঠ্য ক্ষেত্রের ডিডএন্ডঅনএক্সিট ইভেন্টটিকে ইন্টারফেসবিল্ডারের কোনও ক্রিয়া (আইবিএક્શન) এর সাথে সংযুক্ত করেন, যখন ব্যবহারকারী কীবোর্ডটি (রিটার্ন কী সহ) খারিজ করে দেবে এবং প্রেরকটি ইউআইটিেক্সটফিল্ডের একটি উল্লেখ হবে যা ইভেন্টটি বহিষ্কার করেছে।
উদাহরণ স্বরূপ:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
তারপরে, ইন্টারফেসবিল্ডারে, পাঠ্য ক্ষেত্রের ডিডইডঅনএক্সিট ইভেন্টটিকে আপনার নিয়ামকের এই ক্রিয়াটির সাথে লিঙ্ক করুন (বা আপনি ইউআই থেকে ইভেন্টগুলি লিঙ্ক করতে যা কিছু ব্যবহার করছেন)। যখনই ব্যবহারকারী পাঠ্য প্রবেশ করে এবং পাঠ্য ক্ষেত্রটি খারিজ করে দেয়, নিয়ামকটি এই বার্তাটি প্রেরণ করা হবে।
আপনি নিজের কন্ট্রোলারে একটি পদ্ধতিও তৈরি করতে পারেন
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
এবং তারপরে আইবিতে সংযোগ পরিদর্শক ইভেন্টটিকে এর সাথে "ডিড এন্ড প্রস্থান" সংযুক্ত করুন।
DidEndOnExit
ইভেন্টটি সাবস্ক্রাইব করে , আপনাকে কল করার দরকার নেই resignFirstResponder
। আপনি এটি একটি প্রতীকী ব্রেকআপপয়েন্ট রেখে পরীক্ষা করতে পারেন [UIResponder resignFirstResponder]
। মনে রাখবেন যে আপনি যদি পদত্যাগপূর্বরপ্সন্ডারকে কল নাও করেন তবুও এটি সিস্টেমের দ্বারা কল হয়ে যায়। এটি ম্যাট নিউবুর্গের
কুবি, ধন্যবাদ আপনার কোড কাজ করেছে। শুধু স্পষ্ট হতে (নতুনদের পছন্দ জন্য) আপনি বলতে হিসাবে আপনি সেট করতে UITextField
'র delegate
ViewController যা টেক্সট ক্ষেত্রের বসবাস সমান হতে। আপনি যেখানে খুশি সেখানে এটি করতে পারেন। আমি viewDidLoad
পদ্ধতিটি বেছে নিয়েছি ।
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
delegate
তবে আপনিও পাঠ্য ক্ষেত্রটি সেট করতে পারেন । উপরোক্ত হিসাবে যেমনটি আপনার প্রোগ্রামালিকভাবে করতে হবে না। হয় অ্যাপ্রোচ ঠিক আছে।
কোনও কোড ছাড়াই স্বয়ংক্রিয় কীবোর্ড বরখাস্ত আচরণ পাওয়ার জন্য এখানে একটি কৌশল। নিবিতে, পরিচয় পরিদর্শকের প্রথম প্রতিক্রিয়াশীল প্রক্সি অবজেক্টটি সম্পাদনা করুন, একটি নতুন প্রথম প্রতিক্রিয়াকারী ক্রিয়া যুক্ত করুন; আসুন এটি কল dummy:
। dummy:
প্রথম প্রতিক্রিয়াকারী প্রক্সি অবজেক্টটির ক্রিয়াতে পাঠ্য ক্ষেত্রের ডিড এন্ড প্রস্থান ইভেন্টটিকে এখন হুক করুন । এটাই! যেহেতু পাঠ্য ক্ষেত্রের ডিড এন্ড প্রস্থান ইভেন্টটিতে এখন একটি ক্রিয়া-লক্ষ্য জোড়া রয়েছে, ব্যবহারকারী রিটার্নটি ট্যাপ করলে পাঠ্য ক্ষেত্রটি স্বয়ংক্রিয়ভাবে তার কীবোর্ড খারিজ করে দেয়; এবং যেহেতু প্রতিক্রিয়াশীল চেইন প্রেরণ করা বার্তার জন্য কোনও হ্যান্ডলার খুঁজে না পাওয়ার জন্য কোনও জরিমানা নেই, dummy:
কোথাও বাস্তবায়ন না হওয়া সত্ত্বেও অ্যাপটি ক্রাশ হয় না ।
শুধু যোগ কর
[textField endEditing:YES];
যেখানে আপনি কীবোর্ড অক্ষম করতে এবং চয়নকারী দৃশ্যটি প্রদর্শন করতে চান।
সুইফটে আপনি কন্ট্রোলারে একটি আইবিএक्शन লিখতে পারেন এবং পাঠ্য ক্ষেত্রের ডিড এন্ড প্রস্থান ইভেন্টটিকে সেই ক্রিয়াতে সেট করতে পারেন
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Swift 4.2
এবং এটি 100% কাজ করবে
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
আপনি ব্যবহার করতে পারেন
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
আপনার অনেকগুলি ইউটেক্সটফিল্ড থাকলে সেরা একটি:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
এটি কাজ করার জন্য এখানে আমাকে যা করতে হয়েছিল তা আমি এখানে দিয়েছি এবং আমি মনে করি যে কীবোর্ডের জন্য নম্বর প্যাডযুক্ত যে কেউ (বা সম্পন্ন বোতাম ছাড়াই অন্য যে কোনও একটির জন্য প্রয়োজনীয়:
আমি একটি ফাংশন তৈরি করেছি
-(IBAction)backgroundIsTapped:(id)sender
এটি .h ফাইলে সংজ্ঞায়িতও হয়েছিল।
এর পরে, আমি ইন্টারফেস বিল্ডারে ভিউ কন্ট্রোলারের জন্য 'টাচ ডাউন' বিটের সাথে লিঙ্ক করেছি।
'ব্যাকগ্রাউন্ডটি ট্যাপড' ফাংশনে, আমি এটি রেখেছি:
[answerField resignFirstResponder];
আপনি যে ইউআইটিেক্সটফিল্ডটি কীবোর্ড থেকে মুছে ফেলতে চান তার নাম 'উত্তরফিল্ড' পরিবর্তন করতে মনে রাখবেন (অবশ্যই আপনার ইউআইটিেক্সটফিল্ড নীচের মত সংজ্ঞায়িত হয়েছে তা নিশ্চিত করুন :)
IBOutlet UITextField * <nameoftextfieldhere>;
আমি জানি এই টপিকটি সম্ভবত অনেক দিন আগে মারা গিয়েছিল ... তবে আমি আশা করছি এটি কারও কারও সাহায্য করবে, কোথাও!
আপনি লক্ষ্য করবেন যে পদ্ধতিটি "টেক্সটফিল্ডশোল্ডার্টર્ન" পাঠ্য-ক্ষেত্রের অবজেক্ট সরবরাহ করে যা ডোন কীটিতে আঘাত করেছে। আপনি যদি ট্যাগটি সেট করেন আপনি সেই পাঠ্য ক্ষেত্রে স্যুইচ করতে পারেন। অথবা আপনি অবজেক্টের পয়েন্টারটির নির্মাতা দ্বারা সঞ্চিত কিছু সদস্যের সাথে ট্র্যাক এবং তুলনা করতে পারেন।
আমার দৃষ্টিভঙ্গি স্ব-অধ্যয়নের জন্য এটির মতো:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
এদিকে, আমি "বৈধতা" পরীক্ষা দিয়েছি যা পদত্যাগের পরে অস্বীকার করে। এটি কেবল উদাহরণের জন্য, সুতরাং ব্যবহারকারী যদি কোনও টাইপ করেন না! মাঠে, এটি বরখাস্ত করবে না। আচরণটি আমি যেমন চেয়েছিলাম তেমন ছিল, তবে আউটপুট ক্রমটি আমার প্রত্যাশা মতো ছিল না।
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
এই অস্বীকারের জন্য গ্রহণযোগ্যতা অনুসরণ করার পরে আমার এনএসএলগ আউটপুট অনুসরণ করা হচ্ছে। আপনি লক্ষ্য করবেন যে আমি পদত্যাগের ফলাফলটি ফিরিয়ে দিচ্ছি, তবে আমি প্রত্যাশা করেছি যে এটি মিথ্যা কলারের কাছে ফেরত দেওয়ার জন্য আমার কাছে ফিরিয়ে দেবে?! তা ছাড়াও এর প্রয়োজনীয় আচরণ রয়েছে।
13.313 স্টাডিবিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার পাঠ্যফিল্ড শোল্ডার রিটার্ন:] 13.320 স্টাডিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার পাঠ্যফিল্ডশোল্ড এন্ড সম্পাদনা:] 13.327 স্টাডিবিডি [109: 207] না! 13.333 স্টাডিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার পাঠ্যফিল্ড শোল্ডার রিটার্ন:]: কীবোর্ড পদত্যাগ করেছেন না 59.891 স্টাডিবিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার পাঠ্যফিল্ড শোল্ডার রিটার্ন:] 59.897 স্টাডিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার পাঠ্যফিল্ডশোল্ড এন্ড সম্পাদনা:] 59.917 স্টাডিবিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার সম্পন্ন সম্পাদনা পাঠ্য]: না 59.928 স্টাডিবিডি [109: 207] - [স্টাডি কেবিডিভিউ কনট্রোলার পাঠ্যফিল্ড শোল্ডার রিটার্ন:]: কীবোর্ড পদত্যাগ করেছেন না
এখানে রিটার্ন কী বা পটভূমির স্পর্শ সহ সংস্করণ শেষ করার বেশ পরিষ্কার উপায়।
ইন্টারফেস বিল্ডারে, ইউআইফর্মভিউ শ্রেণীর দর্শনতে আপনার ক্ষেত্রগুলি এম্বেড করুন
এই শ্রেণিটি কী করে:
কোডটি এখানে:
ইন্টারফেস
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
বাস্তবায়ন
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
ফর্মটি সাবক্লাসিং করে এবং textFieldValueIsValid:
পদ্ধতিটিকে ওভাররাইড করে
, যদি দেওয়া ক্ষেত্রের জন্য মানটি সঠিক না হয় তবে আপনি সংস্করণটির শেষ এড়াতে পারবেন।
ইন্টারফেস বিল্ডারে যদি কোনও ক্ষেত্রের কোনও প্রতিনিধি সেট থাকে তবে ফর্মটি এটি পরিবর্তন করে না। আমি নির্দিষ্ট ক্ষেত্রে আলাদা প্রতিনিধি স্থাপন করার অনেক কারণ দেখছি না, তবে কেন ...
এই ফর্ম দর্শন শ্রেণীর উন্নতি করার জন্য অনেকগুলি উপায় রয়েছে - একটি ডেলিগেট সংযুক্ত করুন, কিছু বিন্যাস করুন, কী-বোর্ডগুলি কোনও ক্ষেত্রটি আবরণ করার সময় হ্যান্ডেল করুন (কারেন্টএডিটিংটেক্সটফিল্ড ফ্রেম ব্যবহার করে), পরবর্তী ক্ষেত্রের জন্য স্বয়ংক্রিয়ভাবে সংস্করণ শুরু করুন, ...
আমি ব্যক্তিগতভাবে এটিকে আমার কাঠামোর মধ্যে রাখি এবং বৈশিষ্ট্যগুলি যুক্ত করতে সর্বদা এটি সাবক্লাস করি, এটি প্রায়শই "যেমন রয়েছে" তেমন কার্যকর।
আমি আশা করি এটি সাহায্য করবে। সবাইকে চিয়ার্স করুন
আপনি যদি কোনও ইউআইভিউউকন্ট্রোলারে সমস্ত সম্পাদনা চান তবে আপনি ব্যবহার করতে পারেন।
[[self view]endEditing:YES];
এবং আপনি যদি একটি পার্টিকুলার ইউআইটিেক্সটফিল্ড কীবোর্ড লুকাকে খারিজ করতে চান তবে ব্যবহার করুন।
আপনার ভিউকন্ট্রোল.আরে 1. প্রতিনিধি যুক্ত করুন
<UITextFieldDelegate>
আপনার পাঠ্যক্ষেত্রে অক্ষম করুন unable
self.yourTextField.delegate = স্ব;
আপনার ভিউকন্ট্রোলারে এই পদ্ধতিটি যুক্ত করুন।
- (BOOL) টেক্সটফিল্ডশোল্ড এন্ড এডিটিং: (ইউআইটিেক্সটফিল্ড *) টেক্সটফিল্ড {[টেক্সটফিল্ডের পদত্যাগপত্রে ফার্স্ট রেসপন্ডার]; প্রত্যাবর্তন হ্যাঁ;}
প্রোগ্রামিয়ালি ইউআইটিেক্সটফিল্ডের প্রতিনিধিটিকে সুইফ্ট 3-এ সেট করুন
আপনার ভিউকন্ট্রোলারআরউইফট ফাইলটিতে ইউআইটিএফেক্সটফিল্ড ডেলিগেটটি প্রয়োগ করুন (উদাহরণস্বরূপ শ্রেণি ভিউ কন্ট্রোলার: ইউআইভিউকন্ট্রোলার, ইউআইটিএফসেক্সফিল্ডডিলিগেট {)
lazy var firstNameTF: UITextField = {
let firstname = UITextField()
firstname.placeholder = "FirstName"
firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
firstname.textAlignment = .center
firstname.borderStyle = UITextBorderStyle.roundedRect
firstname.keyboardType = UIKeyboardType.default
firstname.delegate = self
return firstname
}()
lazy var lastNameTF: UITextField = {
let lastname = UITextField()
lastname.placeholder = "LastName"
lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
lastname.textAlignment = .center
lastname.borderStyle = UITextBorderStyle.roundedRect
lastname.keyboardType = UIKeyboardType.default
lastname.delegate = self
return lastname
}()
lazy var emailIdTF: UITextField = {
let emailid = UITextField()
emailid.placeholder = "EmailId"
emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
emailid.textAlignment = .center
emailid.borderStyle = UITextBorderStyle.roundedRect
emailid.keyboardType = UIKeyboardType.default
emailid.delegate = self
return emailid
}()
// চিহ্ন: - প্রতিনিধি পাঠ্য ফিল্ড পরিচালনা ...
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == firstNameTF {
lastNameTF.becomeFirstResponder()
}
else if textField == lastNameTF {
emailIdTF.becomeFirstResponder()
}
else {
view.emailIdTF(true)
}
return true
}
একটি ফাংশন হেডকিবোর্ড তৈরি করুন এবং এটি .xib ফাইলের পাঠ্যক্ষেত্রের সাথে লিঙ্ক করুন এবং ডিডএন্ডঅনএক্সিট নির্বাচন করুন
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
আপনি যদি ইন্টারফেস বিল্ডার ব্যবহার করে ভিউ তৈরি করে থাকেন তবে নীচে কেবল একটি পদ্ধতি তৈরি করুন,
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
দৃশ্যে পাঠ্যের ক্ষেত্রে ঠিক ডান ক্লিক করুন, এবং ইভেন্টটিকে ডিড এন্ড প্রস্থান হিসাবে সেট করুন এবং এটিকে "বরখাস্ত কীবোর্ড" পদ্ধতিতে তার করুন।
নতুনদের জন্য সেরা গাইড হলেন "হেড ফার্স্ট আইফোন এবং আইপ্যাড বিকাশ, ২ য় সংস্করণ"
এটা চেষ্টা কর
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
যে কেউ খুঁজছেন সুইফট 3
1) আপনার ইউআইটিেক্সটফিল্ডের প্রতিনিধি নিশ্চিত করুন স্টোরিবোর্ডে সাথে তারযুক্ত রয়েছে তা
2) UITextFieldDelegate প্রয়োগ করুন আপনার ফাইলটিতে করুন (উদাহরণস্বরূপ শ্রেণি ভিউকন্ট্রোলার: ইউআইভিউকন্ট্রোলার, ইউআইটিএফসেক্সফিল্ডডিলিগেট {)
3) নীচে প্রতিনিধি পদ্ধতি ব্যবহার করুন
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
এইভাবেই আমি সুইফট ৪.২-এ কীবোর্ডটি খারিজ করি এবং এটি আমার পক্ষে কাজ করে:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
সুইফট 3, আইওএস 9+
@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}
ইউপিডি: এটি এখনও আমার পক্ষে ভাল কাজ করে। আমি মনে করি যে এই উত্তরটি উত্সর্গকারী লোকটি কেবল বুঝতে পারেনি যে তাকে স্টোরিবোর্ডে ইউআইটিেক্সটফিল্ডে এই ক্রিয়াটি আবদ্ধ করা দরকার।