読者です 読者をやめる 読者になる 読者になる

キーボードでEnterを押すと画面をキーボードが閉じるようにする

Swiftではなにも実装しないとEnterを押してもキーボードが閉じません

そこで以下のように実装します

import UIKit

class ViewController: UIViewController , UITextFieldDelegate{

    @IBOutlet weak var textField: UITextField!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //デリゲートを設定
        textField.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //このメソッドを書くとキーボードを閉じれるようにnarimasu
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        // キーボードを閉じる
        textField.resignFirstResponder()
        return true
    }
}

しかしこの方法だと少し問題あり、、、、

UITextFieldを使うたびに毎回以下のメソッドを書くのはめんどくさいですね、、、

//このメソッドを書くとキーボードを閉じれるようにnarimasu
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        // キーボードを閉じる
        textField.resignFirstResponder()
        return true
    }

同じことを繰り返させないようにすることに全力を出すのがプログラマーです。 そこで以下のように実装しましょう

自動生成されるViewControllerはお便利メソッドを置いておくクラスとする

ViewController

import UIKit

class ViewController: UIViewController , UITextFieldDelegate{
    
    var textFieldDelegate:UIViewController?

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        // キーボードを閉じる
        textField.resignFirstResponder()
        return true
    }
}

これを作成し、Main.storyboardの画面ごとに新しくViewControllerクラスを作成し、先ほど作成したViewControllerに継承?させます

MainViewController

import UIKit

//先ほど作成したViewControllerクラスを継承させる
class MainViewController: ViewController{
    
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //アウトレット接続したUITextFieldにデリゲートをセットさせる
        textField.delegate = self
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

以上です。 これ同じメソッドを何回も書く必要はなくなりました。

私はこのViewControllerクラスに画面遷移するメソッドなどよく使う機能はここに書いて呼び出すようにしています。 ViewControllerが肥大化すると可読性がさがるので、、