ฉันรู้ว่าฉันต้องบอก UITextField ของฉันให้ลาออกก่อนที่จะตอบกลับเมื่อฉันต้องการถอดแป้นพิมพ์ออก แต่ฉันไม่แน่ใจว่าจะรู้ได้อย่างไรเมื่อผู้ใช้กดปุ่ม "เสร็จสิ้น" บนแป้นพิมพ์ มีการแจ้งเตือนที่ฉันสามารถดูได้หรือไม่
ฉันรู้ว่าฉันต้องบอก UITextField ของฉันให้ลาออกก่อนที่จะตอบกลับเมื่อฉันต้องการถอดแป้นพิมพ์ออก แต่ฉันไม่แน่ใจว่าจะรู้ได้อย่างไรเมื่อผู้ใช้กดปุ่ม "เสร็จสิ้น" บนแป้นพิมพ์ มีการแจ้งเตือนที่ฉันสามารถดูได้หรือไม่
คำตอบ:
ฉันตั้งตัวแทนของชั้นเรียนUITextField
ของฉันViewController
ในชั้นเรียนฉันใช้วิธีนี้ดังต่อไปนี้:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
NO
แทนYES
?
NO
คุณหลีกเลี่ยงการเพิ่มบรรทัดกลับไปที่ข้อความ
หากคุณเชื่อมต่อเหตุการณ์ DidEndOnExit ของฟิลด์ข้อความกับการกระทำ (IBAction) ใน InterfaceBuilder จะมีข้อความเมื่อผู้ใช้ออกจากแป้นพิมพ์ (พร้อมปุ่มส่งคืน) และผู้ส่งจะอ้างอิงถึง UITextField ที่ส่งเหตุการณ์
ตัวอย่างเช่น:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
จากนั้นใน InterfaceBuilder ให้เชื่อมโยงเหตุการณ์ DidEndOnExit ของฟิลด์ข้อความไปยังการกระทำนี้บนคอนโทรลเลอร์ของคุณ (หรือสิ่งที่คุณใช้เพื่อเชื่อมโยงกิจกรรมจาก UI) เมื่อใดก็ตามที่ผู้ใช้ป้อนข้อความและยกเลิกช่องข้อความตัวควบคุมจะถูกส่งข้อความนี้
นอกจากนี้คุณยังสามารถสร้างวิธีการในตัวควบคุมของคุณ
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
และจากนั้นในตัวตรวจสอบการเชื่อมต่อใน IB เชื่อมต่อเหตุการณ์ "ไม่สิ้นสุดที่ทางออก"
DidEndOnExit
คุณสามารถทดสอบโดยการใส่เบรกพอยต์สัญลักษณ์บนresignFirstResponder
[UIResponder resignFirstResponder]
โปรดทราบว่าแม้ว่าคุณจะไม่ได้โทรไปยังลาออกการตอบกลับแรกก็ยังคงได้รับการเรียกจากระบบ นี่คือคำอธิบายในหนังสือยอดเยี่ยมของ Matt Neuburg: apeth.com/iOSBook/…
kubi ขอบคุณ รหัสของคุณใช้งานได้ เพียงเพื่อจะชัดเจน (สำหรับมือใหม่ที่ชอบ) ตามที่คุณบอกว่าคุณมีการตั้งค่าUITextField
's 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
เช่นกัน คุณไม่ต้องทำสิ่งนี้โดยทางโปรแกรมดังที่แสดงไว้ด้านบน ทั้งสองวิธีใช้งานได้ดี
ต่อไปนี้เป็นเคล็ดลับในการทำให้เกิดการเลิกใช้แป้นพิมพ์อัตโนมัติโดยไม่มีรหัสเลย ในปลายปากกาแก้ไขวัตถุพร็อกซี Responder แรกในตัวตรวจสอบตัวตนเพิ่มการดำเนินการตอบกลับแรกใหม่ dummy:
ขอเรียกว่า ตอนนี้ขอเหตุการณ์ Did End on Exit ของฟิลด์ข้อความกับการdummy:
กระทำของวัตถุพร็อกซี Responder แรก แค่นั้นแหละ! เนื่องจากขณะนี้เหตุการณ์ Did End on Exit ของฟิลด์ข้อความมีคู่การดำเนินการและเป้าหมายฟิลด์ข้อความจะยกเลิกคีย์บอร์ดโดยอัตโนมัติเมื่อผู้ใช้แตะที่ Return และเนื่องจากไม่มีบทลงโทษสำหรับการไม่หาตัวจัดการสำหรับข้อความที่ส่งถึงเครือข่ายผู้ตอบคำถามแอพจึงไม่ทำงานผิดพลาดแม้ว่าจะไม่มีการใช้งานdummy:
ที่ใดก็ตาม
เพียงเพิ่ม
[textField endEditing:YES];
ตำแหน่งที่คุณต้องการปิดใช้งานแป้นพิมพ์และแสดงมุมมองตัวเลือก
ใน Swift คุณสามารถเขียน IBAction ในคอนโทรลเลอร์และตั้งค่าเหตุการณ์Did End On Exitของฟิลด์ข้อความเป็นแอ็คชันนั้น
@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];
}
ดีที่สุดถ้าคุณมี Uitextfields มากมาย:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
นี่คือสิ่งที่ฉันต้องทำเพื่อให้มันใช้งานได้และฉันคิดว่าเป็นสิ่งจำเป็นสำหรับทุกคนที่มี Number Pad สำหรับแป้นพิมพ์ (หรือแป้นอื่น ๆ ที่ไม่มีปุ่มทำ)
ฉันสร้างฟังก์ชั่นที่เรียกว่า
-(IBAction)backgroundIsTapped:(id)sender
สิ่งนี้ถูกกำหนดในไฟล์. h ด้วย
หลังจากนี้ฉันเชื่อมโยงกับบิต 'touch down' สำหรับ ViewController ใน Interface Builder
ในฟังก์ชั่น 'background tapped' ฉันใส่สิ่งนี้:
[answerField resignFirstResponder];
เพียงจำไว้ว่าให้เปลี่ยน 'answerField' เป็นชื่อของ UITextField ที่คุณต้องการลบคีย์บอร์ด (แน่นอนว่าต้องแน่ใจว่า UITextField ของคุณถูกกำหนดไว้ด้านล่าง :)
IBOutlet UITextField * <nameoftextfieldhere>;
ฉันรู้ว่าหัวข้อนี้อาจเสียชีวิตไปนานแล้ว ... แต่ฉันหวังว่าสิ่งนี้จะช่วยใครซักคน!
คุณจะสังเกตเห็นว่าวิธีการ "textFieldShouldReturn" ให้วัตถุฟิลด์ข้อความที่มีการกดปุ่ม DONE หากคุณตั้งค่าแท็กคุณสามารถเปิดช่องข้อความนั้นได้ หรือคุณสามารถติดตามและเปรียบเทียบตัวชี้ของวัตถุกับค่าสมาชิกบางส่วนที่จัดทำโดยผู้สร้าง
วิธีการของฉันเป็นเช่นนี้เพื่อการศึกษาด้วยตนเอง:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
ในขณะเดียวกันฉันวางการทดสอบ "การตรวจสอบ" ที่ปฏิเสธการลาออกดังนี้ มันเป็นเพียงภาพประกอบเท่านั้นดังนั้นหากผู้ใช้พิมพ์ NO! ลงในช่องก็จะไม่ยกเลิก พฤติกรรมเป็นไปตามที่ฉันต้องการ แต่ลำดับของเอาต์พุตไม่เป็นไปตามที่คาดไว้
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
ต่อไปนี้คือเอาต์พุต NSLog ของฉันสำหรับการปฏิเสธนี้ตามด้วยการยอมรับ คุณจะสังเกตเห็นว่าฉันกำลังคืนผลการลาออก แต่ฉันคาดว่าจะคืนค่า FALSE ให้ฉันเพื่อรายงานกลับไปยังผู้โทร! นอกเหนือจากนั้นมันมีพฤติกรรมที่จำเป็น
13.313 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd [109: 207] ไม่! 13.333 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: ได้ลาออกจากแป้นพิมพ์แล้ว 59.891 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd [109: 207] - [StudyKbdViewController doneEditText]: ไม่ 59.928 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: ได้ลาออกจากแป้นพิมพ์แล้ว
นี่เป็นวิธีที่ค่อนข้างสะอาดในการวางรุ่นด้วยปุ่มส่งคืนหรือสัมผัสในพื้นหลัง
ในตัวสร้างส่วนต่อประสานฝังฟิลด์ของคุณในมุมมองของคลาส UIFormView
ชั้นนี้ทำอะไร:
นี่คือรหัส:
อินเตอร์เฟซ
#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:
เมธอดคุณสามารถหลีกเลี่ยงจุดสิ้นสุดของเอดิชันหากค่าไม่ถูกต้องสำหรับฟิลด์ที่กำหนด
ถ้าเขตข้อมูลมีชุดผู้รับมอบสิทธิ์ในเครื่องมือสร้างอินเทอร์เฟซแล้วแบบฟอร์มจะไม่เปลี่ยนแปลง ฉันไม่เห็นเหตุผลหลายประการในการตั้งผู้แทนที่แตกต่างกันให้กับเขตข้อมูลเฉพาะ แต่ทำไมไม่ ...
มีหลายวิธีในการปรับปรุงคลาสมุมมองฟอร์มนี้ - แนบผู้รับมอบสิทธิ์ดำเนินการบางอย่างจัดการเมื่อแป้นพิมพ์ครอบคลุมฟิลด์ (ใช้เฟรม currentEditingTextField ปัจจุบัน) เริ่มต้นรุ่นโดยอัตโนมัติสำหรับฟิลด์ถัดไป
ฉันเก็บมันไว้ในเฟรมเวิร์คของตัวเองและซับคลาสมันเสมอเพื่อเพิ่มคุณสมบัติมันมักจะมีประโยชน์ "ตามที่เป็น"
ฉันหวังว่ามันจะช่วย ไชโยทั้งหมด
หากคุณต้องการแก้ไขทั้งหมดใน UIViewController คุณสามารถใช้
[[self view]endEditing:YES];
และถ้าคุณต้องการยกเลิกการซ่อนแป้นพิมพ์ UITextField perticular ให้ใช้
1. เพิ่มผู้รับมอบสิทธิ์ใน viewcontroller.h ของคุณ
<UITextFieldDelegate>
ทำให้การมอบหมายไม่สามารถไปที่ฟิลด์ข้อความของคุณ
self.yourTextField.delegate = ตนเอง;
เพิ่มวิธีนี้ในตัวควบคุม viewview ของคุณ
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField ออกจากFirstResponder]; คืนค่า YES;}
ตั้งค่าผู้รับมอบสิทธิ์ของ UITextField โดยทางโปรแกรมโดยทางโปรแกรม 3
ใช้ UITextFieldDelegate ในไฟล์ ViewController.Swift ของคุณ (เช่นคลาส ViewController: UIViewController, UITextFieldDelegate {)
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
}()
// Mark: - การจัดการ textField ของผู้รับมอบสิทธิ์ ..
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 และเลือก DidEndOnExit
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
หากคุณสร้างมุมมองโดยใช้เครื่องมือสร้างอินเตอร์เฟสให้ใช้วิธีการต่อไปนี้เพียงสร้างวิธี
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
เพียงคลิกขวาที่ช่องข้อความในมุมมองและตั้งค่าเหตุการณ์เป็น Did End on Exit และเชื่อมโยงกับวิธีการ "dismissKeyboard"
แนวทางที่ดีที่สุดสำหรับผู้เริ่มต้นคือ "หัวหน้าฝ่ายพัฒนา iPhone และ iPad รุ่นที่ 2"
ลองนี้
- (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;
}
ใครก็ตามที่กำลังมองหาSwift 3
1) ตรวจสอบให้แน่ใจว่าผู้รับมอบสิทธิ์ของ UITextFieldของคุณเชื่อมต่อกับ ViewController ของคุณใน Storyboard
2) ใช้UITextFieldDelegateในไฟล์ ViewController.Swift ของคุณ (เช่นคลาส ViewController: UIViewController, UITextFieldDelegate {)
3) ใช้วิธีมอบสิทธิ์ด้านล่าง
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
นี่คือวิธีที่ฉันยกเลิกคีย์บอร์ดใน Swift 4.2 และทำงานได้สำหรับฉัน:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
Swift 3, iOS 9+
@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}
UPD: มันยังใช้งานได้ดีสำหรับฉัน ฉันคิดว่าผู้ชายที่ทุ่มเทคำตอบนี้ไม่เข้าใจว่าเขาต้องผูกการกระทำนี้กับ UITextField ที่กระดานเรื่องราว
textField.returnKeyType = UIReturnKeyDone;