Làm thế nào để ẩn bàn phím nhanh chóng khi nhấn phím quay lại?


214

Tôi đang sử dụng UITextfiedtrong khi nhấp vào bàn phím textfied xuất hiện nhưng khi tôi nhấn returnphím, bàn phím không biến mất. Tôi đã sử dụng mã sau đây:

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

phương thức resignfirstresponder không hoạt động.


10
Bạn đã cân nhắc chấp nhận câu trả lời của RSC chưa? chấp nhận câu trả lời là những gì làm cho nơi này hoạt động và được coi là một thực hành tốt.
Juan Boero

7
nếu bất kỳ câu trả lời nào đáp ứng yêu cầu của bạn, vui lòng đánh dấu là câu trả lời để người khác có thể nhận trợ giúp từ nó.
Syed Md. Kamruzzaman

Câu trả lời:


397

Bạn có thể làm cho ứng dụng loại bỏ bàn phím bằng chức năng sau

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

Dưới đây là một ví dụ đầy đủ để minh họa rõ hơn rằng:

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

Nguồn mã: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
Tôi đã bị thiếu "self.myTextField.delegate = self;" Cảm ơn bạn!
tylerlindell

4
Tôi đã bỏ lỡ UITextFieldDelegate!
Cesare

1
@kommradHomer, không nghi ngờ gì nữa, có một thứ khác khiến bàn phím của bạn không hiển thị. Nếu bạn muốn, hãy đặt mã của bạn lên pastebin và dán liên kết vào đây để tôi xem.
rsc

1
@RSC bạn có lẽ đúng nhất. Tôi là người mới 2 ngày trên ios, vì vậy bằng cách nào đó đã thoát khỏi vấn đề của tôi và mọi thứ hoạt động như bạn đề xuất :)
kommradHomer

1
Vì vậy, hãy làm việc cho tôi (swift 3): func textFieldShouldReturn(textField: UITextField) -> Bool {đổi thành func textFieldShouldReturn(_ textField: UITextField) -> Bool {
kg biển

112

Phần return truenày chỉ cho trường văn bản xem có được phép trả lại hay không.
Bạn phải thông báo thủ công trường văn bản để loại bỏ bàn phím (hoặc phản hồi đầu tiên của nó là gì) và điều này được thực hiện với resignFirstResponder(), như vậy:

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

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

2
cảm ơn ... trong trường hợp của tôi, phương thức "resignFirstResponder ()" không tự động và tôi nghĩ rằng nó không hỗ trợ nhưng trong khi viết thủ công thì nó vẫn hoạt động tốt .. cảm ơn tôi đang tìm kiếm.
Ashwinkumar Mangrulkar

@AshwinMangrulkar bạn có thể mong đợi rằng trong phiên bản beta của tính năng tự động hoàn tất Xcode 6 có thể bị vô hiệu hóa.
Paul Brewczynski

1
và tất nhiên dấu chấm phẩy sau "true" không còn cần thiết nữa
36 Theo thiết kế

1
không phải là một yêu cầu mà viewContoder của bạn tuân thủ UITextFieldDelegatesao?
Mật ong

1
thay vì self.view.endEditing () câu trả lời này là phù hợp và cách tiếp cận đúng
saigen

45
  • Thêm vào UITextFieldDelegatekhai báo lớp:

    class ViewController: UIViewController, UITextFieldDelegate
  • Kết nối textfieldhoặc viết nó theo chương trình

    @IBOutlet weak var userText: UITextField!
  • đặt bộ điều khiển xem của bạn làm đại biểu trường văn bản trong chế độ xem đã tải:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
    
  • Thêm chức năng sau

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

    với tất cả điều này, bàn phím của bạn sẽ bắt đầu loại bỏ bằng cách chạm vào bên ngoài trường văn bản cũng như bằng cách nhấn phím quay lại.


Cảm ơn người đàn ông! Tôi đã bỏ lỡ điều này: UITextFieldDelegate... cảm ơn rất nhiều!
Adriano Tadao

Vì một số lý do, khi tôi đặt txtField.delegate = self, tôi không thể nhập vào trường văn bản đó một khi tôi chạy ứng dụng
Jesus Rodriguez

@JesusAdolfoRodriguez phải có một lý do đằng sau lỗi đó, tho mã này không gây ra vấn đề gì. : D Chúc mừng mã hóa!
Codetard

Cảm ơn bạn đã từng bước. Điều này hữu ích cho tôi hơn là một khối mã.
kenhkelly

1
"Với tất cả điều này, bàn phím của bạn sẽ bắt đầu loại bỏ bằng cách chạm vào bên ngoài trường văn bản" - Không đúng. textFieldShouldReturn chỉ được gọi khi nhấn nút quay lại.
Jurasic

38

Swift 4.2 - Không cần đại biểu

Bạn có thể tạo một cửa hàng hành động từ UITextField cho " Kích hoạt hành động chính " và từ bỏ phản hồi đầu tiên trên tham số người gửi được gửi trong:

Tạo cửa hàng hành động

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

Siêu đơn giản.

(Cảm ơn video 60 giây của Scott Smith đã cho tôi biết về điều này: https://youtu.be/v6GrnVQy7iA )


nếu chúng ta có nhiều trường văn bản trên một trang thì chúng ta có cần phải làm điều đó cho từng trường văn bản không ...
DragonFire

@DragonFire Bạn có thể gán nhiều trường văn bản cho cùng một ổ cắm. Chỉ cần kéo từ ổ cắm Kích hoạt hành động chính trong thanh tra ổ cắm (phía bên trái màn hình) đến IBAction trong mã của bạn
Brad Root

Bạn nên lưu ý rằng việc kéo trực tiếp từ trường văn bản trong bảng phân cảnh sẽ mặc định hành động được liên kết thành Chỉnh sửa đã kết thúc, thay vì Kích hoạt hành động chính, do đó, nên thực hiện từ Trình kiểm tra kết nối của thanh bên.
Đám mây

Kinh ngạc. Tôi không biết điều đó. Cảm ơn.
Numan Karaaslan

Cũng hoạt động với Swift 2, nếu ai vẫn quan tâm. Cảm ơn.
sirusexsir88

22

Giải pháp Swift 3 đơn giản: Thêm chức năng này vào bộ điều khiển xem của bạn có trường văn bản:

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

Sau đó, mở trình soạn thảo trợ lý của bạn và đảm bảo cả Main.storyboard của bạn nằm ở một phía của chế độ xem của bạn và tệp điều khiển chế độ xem mong muốn ở phía bên kia. Nhấp vào trường văn bản và sau đó chọn từ bảng tiện ích bên phải 'Hiển thị tab Trình theo dõi kết nối'. Kiểm soát kéo từ 'Đã kết thúc khi thoát' đến chức năng trên trong tệp nhanh chóng của bạn. Lặp lại cho bất kỳ trường văn bản nào khác trong cảnh đó và liên kết đến cùng chức năng.


14

@RSC

đối với tôi, phần bổ sung quan trọng trong Xcode Phiên bản 6.2 (6C86e) là trong override func viewDidLoad()

 self.input.delegate = self;

Đã thử làm cho nó hoạt động với phím trả về trong nhiều giờ cho đến khi tôi tìm thấy bài viết của bạn, RSC. Cảm ơn bạn!

Ngoài ra, nếu bạn muốn ẩn bàn phím nếu bạn chạm vào bất kỳ nơi nào khác trên màn hình:

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

12

Để loại bỏ bàn phím tự động, tôi đặt mã này vào một trong các phương thức của lớp văn bản tùy chỉnh của tôi:

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

Thay thế tên cửa hàng của bạn cho textField.


1
Nổi bật. Đây là lựa chọn ngắn nhất và tốt nhất theo ý kiến ​​của tôi. Đặc biệt là khi bạn đang tạo một trường văn bản bên trong một phương thức khác. Giống như bên trong một tiêu đề xem bảng.
kakubei

Xin lỗi, chính xác bạn phải đặt cái này ở đâu và bạn phải làm gì để đóng bàn phím? Tôi đặt mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(phiên bản Swift 5) vào viewDidLoadnhưng không quay lại cũng không gõ vào đâu đó bên ngoài trường văn bản. Tôi đã nhận được các trường văn bản bằng cách tạo ra một ổ cắm mỗi.
Cháu

Tôi đặt nó trong một lớp con của một lớp tùy chỉnh kế thừa từ UIViewControll. Lớp con cũng phù hợp với UITextViewDelegate và UITextFieldDelegate. Tôi đặt nó trong viewDidAppearphương thức của lớp đó. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Điều này có thể là một chút quá cụ thể cho trường hợp của tôi, nhưng hy vọng nó sẽ giúp. Hãy thử thực hiện cuộc gọi trong viewDidAppearvà tuân thủ bất kỳ đại biểu nào nếu cần thiết.
peacetype

10

Một cách khác để làm điều này chủ yếu sử dụng bảng phân cảnh và dễ dàng cho phép bạn có nhiều trường văn bản là:

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

Kết nối tất cả các trường văn bản của bạn cho trình điều khiển xem đó với hành động đó trong Did End On Exitsự kiện của từng trường.


Xin lỗi vì vết sưng, nhưng tôi đang thử phương pháp này trong ứng dụng của mình và dường như nó không hoạt động. Tôi có một trường văn bản trong thanh điều hướng và tôi đã kết nối nó với hành động này với sự kiện đó như bạn đã nói, nhưng nó không hoạt động trong thời gian chạy.
wasimsandhu

Điều này sẽ sập nếu người gửi thuộc loại UIBarButtonItem. Nếu tôi thêm thanh công cụ với nút Xong vào bàn phím số thì mã của bạn sẽ bị lỗi với bộ chọn không được nhận dạng được gửi đến nhật ký cá thể.
Jayprakash Dubey

8

Tôi sẽ sugest để khởi tạo Class từ 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

Khi người dùng nhấn nút Xong trên bàn phím văn bản, sự kiện Did End On Exit sẽ được tạo; tại thời điểm đó, chúng ta cần nói với trường văn bản từ bỏ quyền kiểm soát để bàn phím sẽ biến mất. Để làm điều đó, chúng ta cần thêm một phương thức hành động vào lớp trình điều khiển của chúng ta. Chọn ViewControll.swift thêm phương thức hành động sau:

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

Chọn Main.storyboard trong Project Navigator và hiển thị trình kiểm tra kết nối. Kéo từ vòng tròn bên cạnh Đã kết thúc khi thoát sang biểu tượng Trình điều khiển xem màu vàng trong bảng phân cảnh và buông tay. Một menu nhỏ bật lên sẽ xuất hiện chứa tên của một hành động, hành động chúng ta vừa thêm. Nhấp vào hành động textFieldDoneEditing để chọn nó và đó là hành động.


8

Đây là bản cập nhật Swift 3.0 cho nhận xét của peacetype:

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

đây là một câu trả lời rõ ràng
po5i

Đây phải là câu trả lời được chấp nhận. Làm việc trên một thử duy nhất.
Jaswant Singh

7

Tôi ghét phải thêm chức năng tương tự cho mọi UIViewControll. Bằng cách mở rộng UIViewContoder để hỗ trợ UITextFieldDelegate, bạn có thể cung cấp một hành vi mặc định là "nhấn trở lại".

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

Khi bạn tạo UIViewControll và UITextField mới, tất cả những gì bạn phải làm là viết một mã dòng trong UIViewControll của bạn.

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

Bạn thậm chí có thể bỏ qua mã một dòng này bằng cách nối đại biểu trong Main.storyboard. (Sử dụng "ctrl" và kéo từ UITextField sang UIViewControll)


5

Swift 3

Thêm mã này dưới đây vào VC của bạn

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

Làm việc cho tôi


3

Đảm bảo rằng đại biểu textField của bạn được đặt thành trình điều khiển xem mà bạn đang viết mã liên quan đến trường văn bản của mình.

self.textField.delegate = self

3

Nhanh

Sử dụng chức năng tùy chọn từ UITextFieldDelegate.

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

falsecó nghĩa là lĩnh vực đó có thể được yêu cầu từ chức. true- lực lượng từ chức.


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

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

sau đó bạn sử dụng chức năng này

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

2

bạn có thể đặt nó ở bất cứ đâu nhưng không phải trong UIButton

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

sau đó bạn có thể đặt mã này vào một nút (ví dụ: ví dụ):

self.view.endEditing(true)

cái này làm việc cho tôi


2

Trong trình điều khiển xem bạn đang sử dụng:

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

Tôi thích touchesBegan func, hoạt động trong swift 4 cảm ơn bạn.
AJ Hernandez

-1

bạn nên kết nối UITextfied với một đại biểu của bộ điều khiển khung nhìn để thực hiện chức năng này được gọi là


-1

Tất cả trong một Ẩn Bàn phím và Di chuyển Chế độ xem trên Bàn phím Mở: 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
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.