ฉันรู้ว่าฉันต้องบอก 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;