[SWIFT] Créez deux DatePickers liés à TextField

introduction

Créons deux UIDatePickers et résumons comment les entrer dans TextField.

Environnement de développement

macOS Catalina 10.15.7 Xcode 12.1 Swift 5.3

Définition des champs de texte et préparation des variables

Tout d'abord, placez deux champs de texte n'importe où sur le StoryBoard. Cette fois, le premier champ de texte est ATextField et le second est BTextField.

Préparez également les deux variables suivantes.

ViewController.swift


class ViewController: UIViewController { 
    @IBOutlet weak var ATextField: UITextField!
    @IBOutlet weak var BTextFiled: UITextField!

    var APicker: UIDatePicker!
    var BPicker: UIDatePicker!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
}

Définition d'une méthode pour créer un DatePicker

Ensuite, définissez une méthode pour créer un DatePicker à placer dans le TextField.

ViewController.swift


func makePicker(_ isA:Bool) -> UIDatePicker {
    let myPicker:UIDatePicker!
    myPicker = UIDatePicker()
    myPicker.tag = isA ? 1 : 2
    myPicker.datePickerMode = .date
    myPicker.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
    myPicker.preferredDatePickerStyle = .wheels
        
    return myPicker
}

Puisqu'il y a deux DatePickers à créer, prenez true ou false comme argument, et si true, un DatePicker à insérer dans ATextField sera créé, et si false, un DatePicker à insérer dans BTextFiled sera créé.

Mettez les balises 1 et 2 sur chaque DatePicker. Vous pouvez définir librement le DatePicker dans cette méthode.

J'ai fait référence à cet article sur le comportement de DatePicker sur iOS14. →https://qiita.com/kj_trsm/items/a53b0b3f7e1bc7c06106

Définition de la méthode pour détecter le changement de DatePicker

Définit une méthode qui affiche la date saisie lorsque le DatePicker est manipulé par l'utilisateur dans un champ de texte.

ViewController.swift


@objc internal func dateChanged(sender: UIDatePicker){
     let formatter: DateFormatter = DateFormatter()
     formatter.dateFormat = "aaaa année M mois j jour"
       
     let selectedDate = formatter.string(from: sender.date)
     if sender.tag == 1 {
         ATextField.text = selectedDate
     } else {
         BTextFiled.text = selectedDate
     }
   
 }

Tout d'abord, préparez un DateFormatter qui convertit le type Date en type String, stockez la chaîne de caractères convertie dans la variable selectedDate, puis affectez la chaîne de caractères au champ de texte de destination d'entrée en fonction de la balise de l'expéditeur.

Une fois que vous avez fait cela, ajoutezTarget à myPicker dans la méthode makePicker que vous avez définie précédemment.

ViewController.swift


func makePicker(_ isA:Bool) -> UIDatePicker {
    let myPicker:UIDatePicker!
    myPicker = UIDatePicker()
    myPicker.tag = isA ? 1 : 2
    myPicker.datePickerMode = .date
    myPicker.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
    myPicker.preferredDatePickerStyle = .wheels
       
    //ici
    myPicker.addTarget(self, action:  #selector(onDidChangeDate(sender:)), for: .valueChanged)
        
    return myPicker
 }

Traitement pour rétracter le clavier

À ce rythme, le clavier sera laissé sans surveillance lorsque vous commencerez à utiliser DatePicker. Lorsque vous appuyez en dehors du clavier, le clavier se rétracte.

ViewController.swift


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

Créer DatePicker dans ViewDidLoad

Enfin, appelez la méthode qui crée le DatePicker dans ViewDidLoad et saisissez-le dans le champ de texte pour terminer.

ViewContoller.swift


override func viewDidLoad() {
    super.viewDidLoad()
        
    APicker = makePicker(true)
    ATextField.inputView = APicker
        
    BPicker = makePicker(false)
    BTextFiled.inputView = BPicker
        
    }

Code entier

ViewCOntroller.swift


class ViewController: UIViewController {
    @IBOutlet weak var ATextField: UITextField!
    @IBOutlet weak var BTextFiled: UITextField!
    
    var APicker: UIDatePicker!
    var BPicker: UIDatePicker!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        APicker = makePicker(true)
        ATextField.inputView = APicker
        
        BPicker = makePicker(false)
        BTextFiled.inputView = BPicker
        
    }
    
    func makePicker(_ isA:Bool) -> UIDatePicker {
        let myPicker:UIDatePicker!
        myPicker = UIDatePicker()
        myPicker.tag = isA ? 1 : 2
        myPicker.datePickerMode = .date
        myPicker.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
        myPicker.preferredDatePickerStyle = .wheels
        
        myPicker.addTarget(self, action:  #selector(onDidChangeDate(sender:)), for: .valueChanged)
        
        return myPicker
    }
    
    @objc internal func onDidChangeDate(sender: UIDatePicker){
        let formatter: DateFormatter = DateFormatter()
        formatter.dateFormat = "aaaa année M mois j jour"
        
        let mySelectedDate = formatter.string(from: sender.date)
        if sender.tag == 1 {
            ATextField.text = mySelectedDate
        } else {
            BTextFiled.text = mySelectedDate
        }
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        ATextField.endEditing(true)
        BTextFiled.endEditing(true)
    }


}

Recommended Posts

Créez deux DatePickers liés à TextField
Essayez de créer avec Trailblazer
Créez un fichier Jar avec deux lignes de commande
Créer une API XML-RPC avec Wicket
Créez un terrain de jeu avec Xcode 12
Créer un micro service avec Spring Boot