Geri dönüş tuşuna basıldığında klavyeyi hızlıca gizleme


214

UITextfiedMetinli klavyeyi tıklatırken kullanıyorum ama bastığımdareturn tuşa kaybolmuyor. Aşağıdaki kodu kullandım:

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

resignfirstresponder yöntemi işlev görmüyor.


10
RSC cevabını kabul etmeyi düşündünüz mü? cevapları kabul etmek, burayı işe yaratan şeydir ve iyi bir uygulama olarak kabul edilir.
Juan Boero

7
Herhangi bir cevap gereksiniminizi karşılarsa, lütfen diğer kişilerin yardım alabilmesi için cevap olarak işaretleyin.
Syed Md. Kamruzzaman

Yanıtlar:


397

Aşağıdaki işlevi kullanarak uygulamanın klavyeyi kapatmasını sağlayabilirsiniz

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

İşte bunu daha iyi göstermek için tam bir örnek:

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

Kod kaynağı: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
"Self.myTextField.delegate = self;" eksikti Teşekkür ederim!
tylerlindell

4
Ben eksikti UITextFieldDelegate!
Cesare

1
@kommradHomer, şüphesiz klavyenizin göstermemesini sağlayan başka bir şey var. İsterseniz, kodunuzu pastebin'e koyun ve görmem için bağlantıyı buraya yapıştırın.
rsc

1
@RSC büyük olasılıkla haklıydınız. Ben ios üzerinde 2 günlük bir acemi, bu yüzden bir şekilde benim sorunum kurtuldu ve her şey önerildiği gibi çalıştı :)
kommradHomer

1
Öyleyse benim için çalış (hızlı 3): func textFieldShouldReturn(textField: UITextField) -> Bool {değiştir func textFieldShouldReturn(_ textField: UITextField) -> Bool {
deniz-kg

112

Bunun bir return truekısmı metin alanına geri dönmesine izin verilip verilmediğini söyler.
Metin alanına manuel olarak klavyeyi (veya ilk yanıtlayıcının ne olduğunu) reddetmesini söylemelisiniz ve bu şu şekilde yapılır resignFirstResponder():

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

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

2
teşekkürler ... benim durumumda "resignFirstResponder ()" yöntemi otomatik olarak almıyordu ve ben destek olmadığını düşündüm ama el ile onun çalışma iyi yazarken .. bu im arıyor teşekkürler.
Ashwinkumar Mangrulkar

@AshwinMangrulkar, Xcode 6'nın otomatik tamamlama özelliğinin beta sürümünde engelli olmasını bekleyebilirsiniz.
Paul Brewczynski

1
ve tabii ki "true" dan sonra noktalı virgül artık gerekli değil
36 By Design

1
viewController'ınızın uyması gereken bir gereklilik değil UITextFieldDelegatemi?
Bal

1
self.view.endEditing () yerine bu cevap uygun ve doğru yaklaşım
saigen

45
  • UITextFieldDelegateSınıf bildirimine ekleyin :

    class ViewController: UIViewController, UITextFieldDelegate
  • textfieldProgramla bağlayın veya yazın

    @IBOutlet weak var userText: UITextField!
  • görünüm denetleyicinizi görünümdeki temsilci metin alanları yüklendiğinde ayarlayın:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Aşağıdaki işlevi ekleyin

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

    tüm bunlarla birlikte klavyeniz metin alanının dışına dokunarak ve dönüş tuşuna basarak kapatmaya başlayacaktır.


Teşekkürler dostum! Bunu özlüyordum: UITextFieldDelegate... çok teşekkürler!
Adriano Tadao

Bazı nedenlerden dolayı, txtField.delegate = self'i ayarladığımda, uygulamayı çalıştırdıktan sonra bu metin alanına yazamıyorum
Jesus Rodriguez

@JesusAdolfoRodriguez bu hatanın arkasında bir neden olmalı, bu kod herhangi bir soruna neden olmaz. : D Mutlu kodlama!
Codetard

Adım adım teşekkür ederim. Bu benim için sadece bir kod bloğundan daha yararlı oldu.
kenhkelly

1
"Bütün bunlar ile klavyeniz metin alanının dışına dokunarak kapatmaya başlayacaktır" - Doğru değil. textFieldShouldReturn yalnızca dönüş düğmesine basıldığında çağrılır.
Jurasic

39

Swift 4.2 - Delege Gerekmiyor

" Birincil Eylem Tetiklendi " için UITextField öğesinden bir eylem çıkışı oluşturabilir ve iletilen gönderen parametresinde ilk yanıtlayıcıyı istifa edebilirsiniz:

Eylem Çıkışı Oluştur

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

Çok basit.

(Scott Smith'in bana bu konuda bahşiş verdiği 60 saniyelik videoya teşekkürler: https://youtu.be/v6GrnVQy7iA )


bir sayfada birden fazla metin alanımız varsa, bunu her metin alanı için yapmamız gerekir mi?
DragonFire

@DragonFire Aynı çıkışa birden fazla metin alanı atayabilirsiniz. Sadece çıkış denetçisindeki (ekranın sol tarafı) Tetiklenen çıkıştan kodunuzdaki IBAction'a sürükleyin
Brad Root

Film şeridindeki metin alanından doğrudan sürüklemenin, bağlantılı eylemi, Birincil İşlem Tetiklendi yerine Düzenlenen Sonu Düzenleme olarak varsayılan olarak ayarlayacağını unutmayın, bu nedenle kenar çubuğunun Bağlantılar Denetçisinden yapılmalıdır.
Bulut

İnanılmaz. Bunu bilmiyordum. Teşekkürler.
Numan Karaaslan

1
Çok teşekkür ederim. Tam da ihtiyacım olan şey bu. Bir tablo görünümü hücresindeki dönüş düğmesi ile bir klavyeyi kapatmak gerekiyordu. Mükemmel çalışıyor.
piddler

22

Basit Swift 3 Çözümü: Bu işlevi, bir metin alanı içeren görünüm denetleyicilerinize ekleyin:

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

Ardından yardımcı düzenleyicinizi açın ve hem Main.storyboard'unuzun görünümünüzün bir tarafında, hem de istenen view controller.swift dosyasının diğer tarafında olduğundan emin olun. Bir metin alanını tıklayın ve ardından sağ taraftaki yardımcı programlar panelinden 'Bağlantı Denetçisini Göster' sekmesini seçin. 'Çıkışta Bitti' öğesinden hızlı dosyanızdaki yukarıdaki işleve sürüklemeyi kontrol edin. Bu sahnedeki diğer metin alanları için tekrarlayın ve aynı işleve bağlantı verin.


14

@RSC

benim için Xcode Sürüm 6.2'deki (6C86e) kritik ekleme override func viewDidLoad()

 self.input.delegate = self;

Gönderinizi RSC bulana kadar saatlerce dönüş tuşu ile çalışmayı denedim. Teşekkür ederim!

Ayrıca, ekranda başka bir yere dokunursanız klavyeyi gizlemek istiyorsanız:

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

12

Otomatik klavye işten çıkarmayı almak için, bu kodu özel metin alanı sınıfımın yöntemlerinden birine koydum:

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

Çıkışınızın adını değiştirin textField.


1
Muhteşem. Bence bu en kısa ve en iyi seçenek. Özellikle başka bir yöntemin içinde bir metin alanı oluştururken. Tablo görünümü üstbilgisinde olduğu gibi.
kakubei

Maalesef bunu tam olarak nereye koymanız gerekiyor ve klavyeyi kapatmak için ne yapmanız gerekiyor? mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(Swift 5 versiyonu) içine koydum viewDidLoadama metin alanının dışında herhangi bir yere ne geri ne de dokunarak çalıştı. Her biri bir çıkış oluşturarak metin alanlarını aldım.
Neph

UIViewController'den devralınan özel bir sınıfın alt sınıfına koydum. Alt sınıf ayrıca UITextViewDelegate ve UITextFieldDelegate ile de uyumludur. Bunu viewDidAppearo sınıfın yöntemine koydum . UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Bu benim durumum için biraz fazla özel olabilir, ama umarım yardımcı olur. Çağrıyı yapmayı ve viewDidAppeargerekirse delegelere uymayı deneyin .
peacetype

10

Çoğunlukla film şeridini kullanan ve kolayca birden fazla metin alanına sahip olmanıza izin veren bunu yapmanın başka bir yolu:

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

Bu görünüm denetleyicisi için tüm metin alanlarınızı Did End On Exit, her alanın olayındaki o eyleme bağlayın .


Yumru için özür dilerim, ancak bu yöntemi uygulamamda deniyorum ve işe yaramıyor gibi görünüyor. Gezinme çubuğunda bir metin alanım var ve bunu söylediğiniz gibi bu olaya bağladım, ancak çalışma zamanında çalışmıyor.
wasimsandhu

Gönderen UIBarButtonItem türündeyse bu kilitlenir. Sayısal tuş takımına Bitti düğmesiyle araç çubuğu eklersem, kodunuz, örnek günlüğüne gönderilen tanınmayan seçici ile kilitlenmeye zorlanır.
Jayprakash Dubey

8

RSC Sınıfı başlatmak için sugest olurdu:

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

Kullanıcı metin klavyesindeki Bitti düğmesine dokunduğunda, Çıkışta Sona Erdi olayı oluşturulur; o zaman, metin alanına klavyenin kaybolması için kontrolü bırakmasını söylemeliyiz. Bunu yapmak için, denetleyici sınıfımıza bir eylem yöntemi eklememiz gerekir. ViewController.swift öğesini seçin, aşağıdaki eylem yöntemini ekleyin:

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

Proje Gezgini'nde Main.storyboard'u seçin ve bağlantı denetçisini açın. Çıktı Sonu'nun yanındaki daireden film şeridindeki sarı Görünüm Denetleyicisi simgesine sürükleyin ve bırakın. Yeni eklediğimiz tek bir işlemin adını içeren küçük bir açılır menü görünecektir. Seçmek için textFieldDoneEditing eylemine tıklayın ve hepsi bu kadar.


8

Peacetype'ın yorumu için Swift 3.0 güncellemesi:

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

Bu temiz bir cevaptır
po5i

Bu kabul edilen cevap olmalı. Tek denemede çalıştı.
Jaswant Singh

7

Her UIViewController için aynı işlevi eklemek nefret ediyorum. UIViewController'ı UITextFieldDelegate'i destekleyecek şekilde genişleterek, varsayılan olarak "geri basıldı" davranışı sağlayabilirsiniz.

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

Yeni UIViewController ve UITextField oluşturduğunuzda, tek yapmanız gereken UIViewController'ınıza bir satır kodu yazmaktır.

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

Main.storyboard'da delege bağlayarak bu bir satır kodunu bile atlayabilirsiniz. ("Ctrl" kullanarak UITextField öğesinden UIViewController öğesine sürükleyin)


5

Hızlı 3

Aşağıdaki kodu VC'nize ekleyin

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

Benim için çalışıyor


3

TextField temsilcinizin, metin alanı ile ilgili kodunuzu yazdığınız görünüm denetleyicisine ayarlandığından emin olun.

self.textField.delegate = self

3

hızlı

'Den isteğe bağlı işlevi kullanma UITextFieldDelegate.

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

falsebu alanın istifa etmesini isteyebileceği anlamına gelir. true- istifaya zorla.


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

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

o zaman bu işlevi kullan

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

2

bunu herhangi bir yere koyabilirsiniz ama bir UIButton'a yerleştiremezsiniz

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

bu kodu bir düğmeye yerleştirebilirsiniz (örneğin):

self.view.endEditing(true)

bu benim için çalıştı


2

Görünüm denetleyicisinde kullandığınız:

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

Ben func gibi, hızlı çalışır 4 teşekkür ederim.
AJ Hernandez


-1

Hepsi Bir Arada Klavyeyi Gizle ve Klavyede Açık Görünümü Aç: 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
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.