คุณจะยกเลิกคีย์บอร์ดเมื่อแก้ไข UITextField ได้อย่างไร


181

ฉันรู้ว่าฉันต้องบอก UITextField ของฉันให้ลาออกก่อนที่จะตอบกลับเมื่อฉันต้องการถอดแป้นพิมพ์ออก แต่ฉันไม่แน่ใจว่าจะรู้ได้อย่างไรเมื่อผู้ใช้กดปุ่ม "เสร็จสิ้น" บนแป้นพิมพ์ มีการแจ้งเตือนที่ฉันสามารถดูได้หรือไม่


2
[self.view endEditing: ใช่]; ในการสัมผัสเริ่มมอบหมายเป็นทางออกที่ดีที่สุด
Zar E Ahmer

คำตอบ:


351

ฉันตั้งตัวแทนของชั้นเรียนUITextFieldของฉันViewController

ในชั้นเรียนฉันใช้วิธีนี้ดังต่อไปนี้:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}

ดูตัวอย่างด้านบน ... วางสายที่ใช้ IntefaceBuilder เพื่อดำเนินการกับสิ่งที่คุณใช้เป็นคอนโทรลเลอร์ของคุณ ... เมื่อใดก็ตามที่ผู้ใช้ยกเลิกระบบป้อนข้อความ (กดเสร็จแล้ว) สิ่งนี้จะถูกเรียกใช้ ...
Jason Coco

2
อย่างใดอย่างหนึ่งเหล่านี้จะทำงาน - ฟิลด์ข้อความส่งการกระทำของมันเมื่อผู้ใช้กดปุ่ม Return ("เสร็จสิ้น", อะไรก็ตาม) และยังส่งผู้แทน -textFieldShouldReturn:
โนอาห์วิเธอร์สปูนพูน

BTW - สิ่งนี้ใช้ได้กับ UISearchBar ด้วย ตัวอย่างเช่นรหัสของฉันฉันมีสมาชิก IBOutlet searchBarTusb; เมื่อคลิกปุ่ม "ส่งคืน" ของฉัน (UIReturnKeySearch) - (เป็นโมฆะ) searchBarSearchButtonClicked: ฉันใส่ข้อความ [searchBarTusb ลาออก FirstResponder]; โปรดทราบด้วยว่า 'คีย์การส่งคืน' ถูกตั้งค่าใน NIB โดยใช้ตัวสร้างส่วนต่อประสาน
mobibob

กลับมาทำไมNOแทนYES?
Iulian Onofrei

@IulianOnofrei พฤติกรรมเริ่มต้นของปุ่มย้อนกลับคือการเพิ่มการส่งคืนบรรทัดและเก็บแป้นพิมพ์บนหน้าจอ ด้วยการย้อนกลับNOคุณหลีกเลี่ยงการเพิ่มบรรทัดกลับไปที่ข้อความ
kubi

47

หากคุณเชื่อมต่อเหตุการณ์ DidEndOnExit ของฟิลด์ข้อความกับการกระทำ (IBAction) ใน InterfaceBuilder จะมีข้อความเมื่อผู้ใช้ออกจากแป้นพิมพ์ (พร้อมปุ่มส่งคืน) และผู้ส่งจะอ้างอิงถึง UITextField ที่ส่งเหตุการณ์

ตัวอย่างเช่น:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

จากนั้นใน InterfaceBuilder ให้เชื่อมโยงเหตุการณ์ DidEndOnExit ของฟิลด์ข้อความไปยังการกระทำนี้บนคอนโทรลเลอร์ของคุณ (หรือสิ่งที่คุณใช้เพื่อเชื่อมโยงกิจกรรมจาก UI) เมื่อใดก็ตามที่ผู้ใช้ป้อนข้อความและยกเลิกช่องข้อความตัวควบคุมจะถูกส่งข้อความนี้


เหตุการณ์เดียวที่ดูเหมือนว่าอาจใช้งานได้คือ textFieldDidEndEditing ซึ่งระบุว่าจะถูกส่งหลังจาก UITextField ลาออกจากสถานะการตอบกลับเป็นครั้งแรกเท่านั้น ฉันจะรู้ได้อย่างไรว่าฉันต้องลาออกจากสถานะการตอบกลับก่อน?
kubi

ฉันขอโทษเกี่ยวกับคำศัพท์ ... มันไม่ได้การแจ้งเตือนที่เกิดขึ้นจริง (event) ... ฉันจะแก้ไขคำตอบของฉันมีตัวอย่างรวดเร็วและคำอธิบายเพื่อให้เห็นว่า :)
เจสันโคโค่

1
เพื่อชี้แจงคำตอบนี้ textField จะส่งเหตุการณ์ "Did End On Exit" เมื่อคุณกดปุ่มย้อนกลับดังนั้นนั่นคือสิ่งที่คุณต้องเชื่อมโยงไปยังตัวควบคุมของคุณ ฉันคิดว่าวิธีนี้ง่ายกว่าวิธีที่ระบุไว้ข้างต้น
kubi

2
คุณสามารถแก้ไขคำตอบนี้เพื่อที่จะกล่าวถึงเหตุการณ์ที่จะสายโปรด? เห็นได้ชัดว่าดีกว่าการตั้งค่าตัวแทน
Dan Rosenstark

1
ต้องการถอนคำตอบนี้ แต่ทำไม่ได้จนกว่าจะกล่าวถึงเหตุการณ์ DidEndOnExit ผู้ที่มีสิทธิ์แก้ไขโปรดทำการเปลี่ยนแปลงหาก OP ไม่ได้หรือไม่
James Hart

32

นอกจากนี้คุณยังสามารถสร้างวิธีการในตัวควบคุมของคุณ

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

และจากนั้นในตัวตรวจสอบการเชื่อมต่อใน IB เชื่อมต่อเหตุการณ์ "ไม่สิ้นสุดที่ทางออก"


1
นี่เกือบจะไม่ถูกต้องหรืออย่างน้อยก็พลาดประเด็น โดยการสมัครสมาชิกเหตุการณ์คุณไม่จำเป็นต้องโทรDidEndOnExit คุณสามารถทดสอบโดยการใส่เบรกพอยต์สัญลักษณ์บนresignFirstResponder [UIResponder resignFirstResponder]โปรดทราบว่าแม้ว่าคุณจะไม่ได้โทรไปยังลาออกการตอบกลับแรกก็ยังคงได้รับการเรียกจากระบบ นี่คือคำอธิบายในหนังสือยอดเยี่ยมของ Matt Neuburg: apeth.com/iOSBook/…
Chris Conover

19

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;
}

หากคุณเพิ่มฟิลด์ข้อความลงในกระดานเรื่องราวหรือ NIB คุณสามารถตั้งค่าฟิลด์ข้อความได้delegateเช่นกัน คุณไม่ต้องทำสิ่งนี้โดยทางโปรแกรมดังที่แสดงไว้ด้านบน ทั้งสองวิธีใช้งานได้ดี
Rob

18

ต่อไปนี้เป็นเคล็ดลับในการทำให้เกิดการเลิกใช้แป้นพิมพ์อัตโนมัติโดยไม่มีรหัสเลย ในปลายปากกาแก้ไขวัตถุพร็อกซี Responder แรกในตัวตรวจสอบตัวตนเพิ่มการดำเนินการตอบกลับแรกใหม่ dummy:ขอเรียกว่า ตอนนี้ขอเหตุการณ์ Did End on Exit ของฟิลด์ข้อความกับการdummy:กระทำของวัตถุพร็อกซี Responder แรก แค่นั้นแหละ! เนื่องจากขณะนี้เหตุการณ์ Did End on Exit ของฟิลด์ข้อความมีคู่การดำเนินการและเป้าหมายฟิลด์ข้อความจะยกเลิกคีย์บอร์ดโดยอัตโนมัติเมื่อผู้ใช้แตะที่ Return และเนื่องจากไม่มีบทลงโทษสำหรับการไม่หาตัวจัดการสำหรับข้อความที่ส่งถึงเครือข่ายผู้ตอบคำถามแอพจึงไม่ทำงานผิดพลาดแม้ว่าจะไม่มีการใช้งานdummy:ที่ใดก็ตาม


@matt ฉันค้นพบว่าถ้าฉันเพิ่มซีเควสคลายและเชื่อมต่อเหตุการณ์ didEndOnExit จากนั้นสควอชคลายจะถูกเรียกใช้เมื่อกดย้อนกลับ หากไม่มีการเชื่อมต่อเหตุการณ์ระบบจะไม่เปิดการทำงาน เยี่ยมมาก แต่หือ? ข้อสังเกตใด ๆ BTW: ฉันมีหนังสือ Swift ของคุณ (เสร็จสิ้น) และ iOS10 (ในบทที่ 6) พวกเขาช่วยฉันอย่างมาก!
Verticon

@Verticon คำถามและคำตอบไม่มีส่วนเกี่ยวข้องกับ segues ดังนั้นฉันจึงไม่เข้าใจปัญหา ... :( นี่เป็นเรื่องเกี่ยวกับการถอดคีย์บอร์ดอย่างแท้จริง
matt

@ แมทขอโทษผู้ชาย ฉันกำลังสำรองหมูเพราะ 1) ฉันมาที่หัวข้อนี้ในขณะที่ฉันกำลังจัดการกับวิธีการจัดการคีย์ส่งคืนของ UITextField; และ 2) มันเป็นโอกาสที่จะมีปฏิสัมพันธ์กับคุณ (ขอบคุณสำหรับหนังสือ da) ไม่มี "ปัญหา" เพียงแค่ขาดความเข้าใจในส่วนของฉันเกี่ยวกับสาเหตุ / วิธีการทำงานวิธีการทำงาน
Verticon

@Verticon ฉันขอโทษที่ไม่สามารถช่วยได้ อย่าลังเลที่จะตั้งคำถามใหม่ด้วยข้อมูลเพิ่มเติม (โครงการตัวอย่าง?) และ blip ฉันถ้าฉันมีประโยชน์
Matt


11

เพียงเพิ่ม

[textField endEditing:YES];

ตำแหน่งที่คุณต้องการปิดใช้งานแป้นพิมพ์และแสดงมุมมองตัวเลือก


10

ใน Swift คุณสามารถเขียน IBAction ในคอนโทรลเลอร์และตั้งค่าเหตุการณ์Did End On Exitของฟิลด์ข้อความเป็นแอ็คชันนั้น

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

5

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
    }

}

4

คุณยังสามารถใช้

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

ดีที่สุดถ้าคุณมี Uitextfields มากมาย:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }

2

นี่คือสิ่งที่ฉันต้องทำเพื่อให้มันใช้งานได้และฉันคิดว่าเป็นสิ่งจำเป็นสำหรับทุกคนที่มี Number Pad สำหรับแป้นพิมพ์ (หรือแป้นอื่น ๆ ที่ไม่มีปุ่มทำ)

  1. ฉันเปลี่ยน UIView ใน ViewController เป็น UIControl
  2. ฉันสร้างฟังก์ชั่นที่เรียกว่า

    -(IBAction)backgroundIsTapped:(id)sender

สิ่งนี้ถูกกำหนดในไฟล์. h ด้วย

หลังจากนี้ฉันเชื่อมโยงกับบิต 'touch down' สำหรับ ViewController ใน Interface Builder

ในฟังก์ชั่น 'background tapped' ฉันใส่สิ่งนี้:

    [answerField resignFirstResponder];

เพียงจำไว้ว่าให้เปลี่ยน 'answerField' เป็นชื่อของ UITextField ที่คุณต้องการลบคีย์บอร์ด (แน่นอนว่าต้องแน่ใจว่า UITextField ของคุณถูกกำหนดไว้ด้านล่าง :)

    IBOutlet UITextField * <nameoftextfieldhere>;

ฉันรู้ว่าหัวข้อนี้อาจเสียชีวิตไปนานแล้ว ... แต่ฉันหวังว่าสิ่งนี้จะช่วยใครซักคน!


.. แต่มันใช้งานไม่ได้ถ้าผู้ใช้แตะการควบคุมอื่น
ragnarius

2

คุณจะสังเกตเห็นว่าวิธีการ "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:]: ได้ลาออกจากแป้นพิมพ์แล้ว

1
คุณสามารถอธิบายได้หรือไม่ถ้าฉันคืนค่า NO หรือ YES ในทั้งสองกรณีสิ่งเดียวกันเกิดขึ้นดังนั้นสิ่งที่ต้องการคืนค่าใช่ใน textFieldShouldReturn วิธีการมอบหมาย
K. Jaiswal

1

นี่เป็นวิธีที่ค่อนข้างสะอาดในการวางรุ่นด้วยปุ่มส่งคืนหรือสัมผัสในพื้นหลัง

ในตัวสร้างส่วนต่อประสานฝังฟิลด์ของคุณในมุมมองของคลาส 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 ปัจจุบัน) เริ่มต้นรุ่นโดยอัตโนมัติสำหรับฟิลด์ถัดไป

ฉันเก็บมันไว้ในเฟรมเวิร์คของตัวเองและซับคลาสมันเสมอเพื่อเพิ่มคุณสมบัติมันมักจะมีประโยชน์ "ตามที่เป็น"

ฉันหวังว่ามันจะช่วย ไชโยทั้งหมด


1
ชั้นเรียนที่เป็นประโยชน์ จุดเล็ก ๆ จุดหนึ่งคุณไม่ควรนำหน้าคลาสของคุณเองด้วย "UI" ในวัตถุประสงค์ -c คุณควรใช้คำนำหน้าของคุณเอง ("TL"?) ใน Swift อย่าใช้อะไรเลย
kubi

ขอบคุณ @kubi ถูกตัอง. มันเป็น MF ในกรอบของฉันเช่น MooseFactory;)
Moose

1

หากคุณต้องการแก้ไขทั้งหมดใน UIViewController คุณสามารถใช้

[[self view]endEditing:YES];

และถ้าคุณต้องการยกเลิกการซ่อนแป้นพิมพ์ UITextField perticular ให้ใช้

1. เพิ่มผู้รับมอบสิทธิ์ใน viewcontroller.h ของคุณ

<UITextFieldDelegate>
  1. ทำให้การมอบหมายไม่สามารถไปที่ฟิลด์ข้อความของคุณ

    self.yourTextField.delegate = ตนเอง;

  2. เพิ่มวิธีนี้ในตัวควบคุม viewview ของคุณ

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField ออกจากFirstResponder]; คืนค่า YES;}


1

ตั้งค่าผู้รับมอบสิทธิ์ของ 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
}

0

สร้างฟังก์ชั่นคีย์ลัดและเชื่อมโยงไปยังฟิลด์ข้อความในไฟล์. xib และเลือก DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

0

หากคุณสร้างมุมมองโดยใช้เครื่องมือสร้างอินเตอร์เฟสให้ใช้วิธีการต่อไปนี้เพียงสร้างวิธี

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

เพียงคลิกขวาที่ช่องข้อความในมุมมองและตั้งค่าเหตุการณ์เป็น Did End on Exit และเชื่อมโยงกับวิธีการ "dismissKeyboard"

แนวทางที่ดีที่สุดสำหรับผู้เริ่มต้นคือ "หัวหน้าฝ่ายพัฒนา iPhone และ iPad รุ่นที่ 2"


0

ลองนี้

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}

0
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

0

ใครก็ตามที่กำลังมองหาSwift 3

1) ตรวจสอบให้แน่ใจว่าผู้รับมอบสิทธิ์ของ UITextFieldของคุณเชื่อมต่อกับ ViewController ของคุณใน Storyboard

2) ใช้UITextFieldDelegateในไฟล์ ViewController.Swift ของคุณ (เช่นคลาส ViewController: UIViewController, UITextFieldDelegate {)

3) ใช้วิธีมอบสิทธิ์ด้านล่าง

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }

0

นี่คือวิธีที่ฉันยกเลิกคีย์บอร์ดใน 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()
    }

-2

Swift 3, iOS 9+

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

UPD: มันยังใช้งานได้ดีสำหรับฉัน ฉันคิดว่าผู้ชายที่ทุ่มเทคำตอบนี้ไม่เข้าใจว่าเขาต้องผูกการกระทำนี้กับ UITextField ที่กระดานเรื่องราว


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.