จะซ่อนแป้นพิมพ์อย่างรวดเร็วในการกดปุ่มย้อนกลับได้อย่างไร


214

ฉันกำลังใช้UITextfiedในขณะที่คลิกที่แป้นพิมพ์แบบข้อความปรากฏขึ้น แต่เมื่อฉันกดreturnปุ่มแป้นพิมพ์จะไม่หายไป ฉันใช้รหัสต่อไปนี้:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

วิธีการที่ลาออกก่อนหน้าการตอบกลับไม่ได้อยู่ในฟังก์ชัน


10
คุณคิดว่ายอมรับคำตอบ RSC หรือไม่? การยอมรับคำตอบคือสิ่งที่ทำให้สถานที่แห่งนี้ทำงานได้และถือเป็นการปฏิบัติที่ดี
Juan Boero

7
หากคำตอบใด ๆ ที่ตอบสนองความต้องการของคุณโปรดทำเครื่องหมายเป็นคำตอบเพื่อให้คนอื่นได้รับความช่วยเหลือ
Syed Md. Kamruzzaman

คำตอบ:


397

คุณสามารถทำให้แอปยกเลิกคีย์บอร์ดโดยใช้ฟังก์ชั่นต่อไปนี้

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

นี่เป็นตัวอย่างที่สมบูรณ์เพื่อแสดงให้เห็นว่า:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

รหัสแหล่งที่มา: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
ฉันหายไป "self.myTextField.delegate = self;" ขอบคุณ!
tylerlindell

4
ฉันหายไปUITextFieldDelegate!
Cesare

1
@ komradHomer ไม่ต้องสงสัยเลยว่ามีบางอย่างที่ทำให้แป้นพิมพ์ของคุณไม่แสดง ถ้าคุณต้องการใส่รหัสของคุณใน pastebin และวางลิงค์ที่นี่เพื่อให้ฉันดู
rsc

1
@RSC คุณคิดว่าถูกต้องที่สุด ฉันเป็น 2 วัน Newbie บน iOS ดังนั้นอย่างใดได้ขจัดปัญหาของฉันและทุกอย่างทำงานตามที่คุณแนะนำ :)
kommradHomer

1
ดังนั้นทำงานให้ฉัน (รวดเร็ว 3): func textFieldShouldReturn(textField: UITextField) -> Bool {เปลี่ยนเป็น func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg

112

return trueส่วนหนึ่งของการนี้เท่านั้นที่จะบอกฟิลด์ข้อความหรือไม่ก็จะอนุญาตให้กลับ
คุณต้องบอกช่องข้อความด้วยตนเองเพื่อยกเลิกแป้นพิมพ์ (หรือการตอบกลับครั้งแรกของมัน) และสิ่งนี้ก็ทำได้resignFirstResponder()เช่น:

// Called on 'Return' pressed. Return false to ignore.

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

2
ขอบคุณ ... ในกรณีของฉันวิธีการ "quitFirstResponder ()" ไม่ได้รับโดยอัตโนมัติและฉันคิดว่ามันไม่สนับสนุน แต่ในขณะที่เขียนด้วยตนเองมันทำงานได้ดี .. ขอบคุณที่ฉันกำลังมองหา
Ashwinkumar Mangrulkar

@AshwinMangrulkar คุณสามารถคาดหวังได้ว่าในรุ่นเบต้าของคุณลักษณะการเติมข้อมูลอัตโนมัติ Xcode 6 อาจเป็นอุปสรรค
Paul Brewczynski

1
และแน่นอนว่าเครื่องหมายอัฒภาคหลังจาก "true" ไม่จำเป็นอีกต่อไป
36 โดย Design

1
ข้อกำหนดของ viewController ของคุณUITextFieldDelegateใช่หรือไม่?
น้ำผึ้ง

1
แทนการ self.view.endEditing () คำตอบนี้มีความเหมาะสมและแนวทางที่ถูกต้อง
saigen

45
  • เพิ่มUITextFieldDelegateการประกาศคลาส:

    class ViewController: UIViewController, UITextFieldDelegate
  • เชื่อมต่อtextfieldหรือเขียนโดยทางโปรแกรม

    @IBOutlet weak var userText: UITextField!
  • ตั้งค่าตัวควบคุมมุมมองของคุณเป็นตัวแทนเขตข้อมูลข้อความในมุมมองที่โหลด:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
    
  • เพิ่มฟังก์ชั่นต่อไปนี้

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }
    

    ทั้งหมดนี้แป้นพิมพ์ของคุณจะเริ่มยกเลิกโดยการสัมผัสนอก textfield เช่นเดียวกับการกดปุ่มย้อนกลับ


ขอบคุณคน! ฉันคิดถึงสิ่งนี้: UITextFieldDelegate... ขอบคุณมาก!
Adriano Tadao

ด้วยเหตุผลบางอย่างเมื่อฉันตั้งค่า txtField.delegate = self ฉันไม่สามารถพิมพ์ภายในเท็กซ์ฟิลด์นั้นได้เมื่อฉันเรียกใช้แอป
Jesus Rodriguez

@JesusAdolfoRodriguez จะต้องมีเหตุผลที่อยู่เบื้องหลังข้อผิดพลาดนั้นรหัสนี้จะไม่ทำให้เกิดปัญหาใด ๆ : D การเข้ารหัสที่มีความสุข!
Codetard

ขอบคุณสำหรับทีละขั้นตอน สิ่งนี้มีประโยชน์สำหรับฉันมากกว่าแค่บล็อกรหัส
kenhkelly

1
"ทั้งหมดนี้แป้นพิมพ์ของคุณจะเริ่มต้นโดยการสัมผัสนอกฟิลด์ข้อความ" - ไม่จริง textFieldShouldReturn ถูกเรียกใช้เมื่อกดปุ่มย้อนกลับเท่านั้น
Jurasic

39

Swift 4.2 - ไม่จำเป็นต้องมอบสิทธิ์

คุณสามารถสร้างเต้าเสียบการดำเนินการจาก UITextField สำหรับ " การกระทำที่เรียกใช้หลัก " และลาออกจากการตอบกลับครั้งแรกในพารามิเตอร์ผู้ส่งผ่านใน:

สร้าง Action Outlet

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

ง่ายสุด ๆ

(ต้องขอบคุณวิดีโอความยาว 60 วินาทีของ Scott Smith ที่ให้ทิปฉันเกี่ยวกับสิ่งนี้: https://youtu.be/v6GrnVQy7iA )


ถ้าเรามี textfields หลายหน้าเราจำเป็นต้องทำมันสำหรับแต่ละ text field หรือไม่ ...
DragonFire

@DragonFire คุณสามารถกำหนดฟิลด์ข้อความจำนวนมากให้กับเต้าเสียบเดียวกัน เพียงลากจากเต้าเสียบการดำเนินการหลักที่จุดชนวนการตรวจสอบ (ด้านซ้ายของหน้าจอ) ไปยัง IBAction ในรหัสของคุณ
แบรดรูต

เป็นการดีที่จะทราบว่าการลากโดยตรงจากช่องข้อความในกระดานเรื่องราวจะเป็นการเริ่มต้นการดำเนินการที่เชื่อมโยงไปยังการแก้ไขไม่สิ้นสุดแทนที่จะเป็นการกระทำหลักที่ถูกเรียกดังนั้นควรทำจากตัวตรวจสอบการเชื่อมต่อของแถบด้านข้าง
เมฆ

น่าอัศจรรย์ ผมไม่ทราบว่า. ขอบคุณ
Numan Karaaslan

ใช้งานได้กับ Swift 2 หากใครยังคงใส่ใจ ขอบคุณ
siralexsir88

22

Simple Swift 3 Solution: เพิ่มฟังก์ชั่นนี้ไปยังตัวควบคุมมุมมองของคุณที่มีฟิลด์ข้อความ:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

จากนั้นเปิดโปรแกรมแก้ไขผู้ช่วยของคุณและให้แน่ใจว่าทั้ง Main.storyboard ของคุณอยู่ที่ด้านหนึ่งของมุมมองของคุณและไฟล์ view controller.swift ที่ต้องการนั้นอยู่ในอีกด้านหนึ่ง คลิกที่ช่องข้อความจากนั้นเลือกจากแท็บ 'แสดงตัวตรวจสอบการเชื่อมต่อ' แผงอรรถประโยชน์ด้านขวามือ ควบคุมการลากจาก 'Did End on Exit' ไปยังฟังก์ชันด้านบนในไฟล์ swift ของคุณ ทำซ้ำสำหรับฟิลด์ข้อความอื่นในฉากนั้นและลิงก์ไปยังฟังก์ชั่นเดียวกัน


14

@RSC

สำหรับฉันการเพิ่มที่สำคัญใน Xcode เวอร์ชัน 6.2 (6C86e) อยู่ใน override func viewDidLoad()

 self.input.delegate = self;

พยายามทำให้มันทำงานกับปุ่มส่งคืนเป็นเวลาหลายชั่วโมงจนกระทั่งฉันพบโพสต์ของคุณ RSC ขอบคุณ!

นอกจากนี้หากคุณต้องการซ่อนแป้นพิมพ์หากคุณสัมผัสที่ใดก็ได้บนหน้าจอ:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }

12

หากต้องการเลิกใช้แป้นพิมพ์อัตโนมัติฉันใส่รหัสนี้ไว้ในวิธีการอย่างใดอย่างหนึ่งในชั้นเรียนของฟิลด์ข้อความที่กำหนดเอง:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

textFieldแทนชื่อเต้าเสียบของคุณสำหรับ


1
โดดเด่น นี่เป็นตัวเลือกที่สั้นและดีที่สุดในความคิดของฉัน โดยเฉพาะอย่างยิ่งเมื่อคุณสร้างเขตข้อมูลข้อความในวิธีอื่น เหมือนในส่วนหัวของมุมมองตาราง
kakubei

ขออภัยคุณต้องวางสิ่งนี้ไว้ตรงไหนและคุณต้องทำอย่างไรเพื่อปิดคีย์บอร์ด ฉันใส่mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(Swift 5 version) ลงไปviewDidLoadแต่ไม่กลับมาหรือแตะที่อื่นนอก textfield ฉันได้รับ textfields โดยการสร้างเต้าเสียบ
Neph

ฉันวางไว้ในคลาสย่อยของคลาสแบบกำหนดเองที่สืบทอดจาก UIViewController คลาสย่อยยังเป็นไปตาม UITextViewDelegate และ UITextFieldDelegate ฉันใส่มันในviewDidAppearวิธีการเรียน UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })นี่อาจจะเฉพาะเจาะจงกับคดีของฉันเล็กน้อย แต่หวังว่ามันจะช่วยได้ ลองโทรภายในviewDidAppearและสอดคล้องกับผู้ได้รับมอบหมายหากจำเป็น
สันติภาพ

10

อีกวิธีหนึ่งในการทำสิ่งนี้ซึ่งส่วนใหญ่ใช้กระดานเรื่องราวและช่วยให้คุณมีช่องข้อความได้หลายช่องคือ:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

เชื่อมต่อทุกฟิลด์ข้อความของคุณสำหรับตัวควบคุมมุมมองนั้นกับการกระทำนั้นในDid End On Exitเหตุการณ์ของแต่ละฟิลด์


ขออภัยสำหรับการชน แต่ฉันลองใช้วิธีนี้ในแอปของฉันและดูเหมือนว่าจะไม่ทำงาน ฉันมีฟิลด์ข้อความในแถบการนำทางและฉันได้เชื่อมต่อกับการกระทำนี้กับเหตุการณ์ดังที่คุณกล่าว แต่ไม่สามารถใช้งานได้ในขณะทำงาน
wasimsandhu

สิ่งนี้จะล้มเหลวหากผู้ส่งเป็นประเภท UIBarButtonItem หากฉันเพิ่มแถบเครื่องมือพร้อมปุ่ม Done เพื่อแป้นตัวเลขตัวเลขรหัสของคุณจะถูกเชื่อมโยงกับข้อผิดพลาดด้วยตัวเลือกที่ไม่รู้จักที่ส่งไปยังบันทึกอินสแตนซ์
Jayprakash Dubey

8

ฉันอยากจะเริ่ม Class จาก RSC:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}


8

เมื่อผู้ใช้แตะปุ่ม Done บนแป้นพิมพ์ข้อความเหตุการณ์ Did End On Exit จะถูกสร้างขึ้น ในเวลานั้นเราจำเป็นต้องบอกฟิลด์ข้อความเพื่อยกเลิกการควบคุมเพื่อให้คีย์บอร์ดหายไป ในการทำเช่นนั้นเราจำเป็นต้องเพิ่มวิธีการดำเนินการในคลาสควบคุมของเรา เลือก ViewController.swift เพิ่มวิธีการกระทำต่อไปนี้:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

เลือก Main.storyboard ใน Project Navigator และแสดงตัวตรวจสอบการเชื่อมต่อ ลากจากวงกลมถัดจาก Did End On Exit ไปยังไอคอน View Controller สีเหลืองในกระดานเรื่องราวแล้วปล่อยต่อไป เมนูป๊อปอัปขนาดเล็กจะปรากฏขึ้นพร้อมชื่อของการกระทำเดียวที่เราเพิ่งเพิ่มเข้าไป คลิกการกระทำ textFieldDoneEditing เพื่อเลือกและนั่นคือมัน


8

นี่คือการอัปเดต Swift 3.0 เพื่อความคิดเห็นของ peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

นี่เป็นคำตอบที่สะอาด
po5i

นี่ควรเป็นคำตอบที่ยอมรับได้ ทำงานในลองเดียว
Jaswant Singh

7

ฉันเกลียดที่จะเพิ่มฟังก์ชั่นเดียวกันให้กับ UIViewController ทุกคน โดยการขยาย UIViewController เพื่อสนับสนุน UITextFieldDelegate คุณสามารถกำหนดพฤติกรรมเริ่มต้นของ "return pressed"

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

เมื่อคุณสร้าง UIViewController และ UITextField ใหม่สิ่งที่คุณต้องทำคือการเขียนโค้ดหนึ่งบรรทัดใน UIViewController ของคุณ

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

คุณสามารถละเว้นรหัสบรรทัดนี้ได้โดยการต่อผู้แทนใน Main.storyboard (ใช้ "ctrl" และลากจาก UITextField ไปยัง UIViewController)


5

สวิฟท์ 3

เพิ่มรหัสนี้ด้านล่างลงใน VC ของคุณ

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

ได้ผลสำหรับฉัน


3

ตรวจสอบให้แน่ใจว่าผู้รับมอบสิทธิ์ textField ของคุณถูกตั้งค่าเป็นตัวควบคุมมุมมองที่คุณกำลังเขียนโค้ดที่เกี่ยวข้องกับฟิลด์ข้อความ

self.textField.delegate = self

3

รวดเร็ว

UITextFieldDelegateฟังก์ชั่นการใช้ตัวเลือกจาก

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

falseหมายความว่าฟิลด์นั้นสามารถขอให้ลาออกได้ true- บังคับลาออก


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

จากนั้นคุณใช้ฟังก์ชั่นนี้

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

คุณสามารถวางสิ่งนี้ได้ทุกที่ แต่ไม่ใช่ใน UIButton

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

จากนั้นคุณสามารถใส่รหัสนี้ในปุ่ม (เช่น):

self.view.endEditing(true)

สิ่งนี้ใช้ได้สำหรับฉัน


2

ในตัวควบคุมมุมมองที่คุณใช้:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }

ฉันชอบฟังก์ชั่น Began, ทำงานใน swift 4 ขอบคุณ
AJ Hernandez

-1

คุณควรเชื่อมต่อ UITextfied กับผู้รับมอบสิทธิ์ของตัวควบคุมมุมมองเพื่อให้ฟังก์ชันนี้เรียกว่า


-1

All in One Hide Keyboard และ Move View บนคีย์บอร์ด Open: Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

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