自定義UI控件:SexPickerとPrefPicker 性別或地域的下拉列表

**//
//  UICustomPrefPicker.swift
//  ANAPAY
//
//  Created by DBS部 電通國際情報サービス on 2019/11/12.
//  Copyright © 2019 isid. All rights reserved.
//
import UIKit
final class CustomSexPicker {
    /// ピカー作成するIF
    /// - Parameter textField: 紐づくUITextfield
    static func create(textField: UITextField) {
        CustomListPicker.shared.create(textField: textField, dataList: Constants.SEX_CODE_LIST)
    }
}
final class CustomPrefPicker {
    /// ピカー作成するIF
    /// - Parameter textField: 紐づくUITextfield
    static func create(textField: UITextField) {
        CustomListPicker.shared.create(textField: textField, dataList: Constants.PREF_CODE_LIST)
    }
}
struct CustomPickerSet {
        
    //UITextfieldに紐づいてる
    weak var textField: UITextField?
    
    //UITextfieldと紐付くPickerView
    var pickView: UIPickerView
    
    //Picker関連デリゲート
    var source: CustomPickerSource
    
    /// 初期化する
    /// - Parameter textField: 紐づくUITextfield
    init(textField: UITextField, dataList: [String]) {
        self.textField = textField
        self.pickView = UIPickerView()
        self.source = CustomPickerSource()
        self.source.dataList = dataList
        self.textField?.inputView = self.pickView
        self.pickView.delegate = source
        self.pickView.dataSource = source
        self.pickView.showsSelectionIndicator = true
    }
}
// テキストに値を設定する
extension CustomPickerSet {
    mutating func done() {
        self.textField?.text = self.source.dataList[self.pickView.selectedRow(inComponent: 0)]
        self.textField?.endEditing(true)
    }
}
// デレゲートとデータリソースを実裝
class CustomPickerSource: UIControl, UIPickerViewDelegate, UIPickerViewDataSource {
    
    //ピカーのリスト
    var dataList: [String] = []
    
    /// ピカーを1列に設定する
    /// - Parameter pickerView: 対象のpickerView
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    /// ピカーのデーター數を設定する
    /// - Parameter pickerView: 対象のpickerView
    /// - Parameter component: 列番
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return dataList.count
    }
    
    /// ピカーの表示値を設定する
    /// - Parameter pickerView: 対象のpickerView
    /// - Parameter row: インデクス
    /// - Parameter component: 列番
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return dataList[row]
    }
}
class CustomerPickButtonItem: UIBarButtonItem {
    var cPicker: CustomPickerSet?
}
final class CustomListPicker:NSObject {
    static let shared = CustomListPicker()
    private override init() {
        super.init()
    }
    
    /// ピカー作成するIF
    /// - Parameter textField: 紐づくUITextfield
    func create(textField: UITextField, dataList: [String]) {
        let cPicker = CustomPickerSet(textField: textField, dataList: dataList)
        // 決定バーの生成
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: cPicker.pickView.frame.size.width, height: 30))
        let spaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneItem = CustomerPickButtonItem(title: "完了", style: .done, target: self, action: #selector(done(_:)))
        doneItem.tintColor = UIColor.init(hexcode: "#5BADE1")
        doneItem.cPicker = cPicker
        
        toolbar.setItems([spaceItem, doneItem], animated: false)
        toolbar.sizeToFit()
        
        // インプットビュー設定(紐づいているUITextfieldへ代入)
        cPicker.textField?.inputAccessoryView = toolbar
        cPicker.textField?.delegate = self
        
    }
    /// UIPrefPickerのDoneを押したら発火
    /// - Parameter sender: 決定ボタン対象
    @objc func done(_ sender: CustomerPickButtonItem) {
        sender.cPicker?.done()
    }
}
extension CustomListPicker: UITextFieldDelegate {
 
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        textField.isUserInteractionEnabled = false
        return true
    }
    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.isUserInteractionEnabled = true
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return false
    }
}**

性別と地域的數據源

class Constants {
    
    /// 都道府県リスト
    static let PREF_CODE_LIST = [
        "",
        "北海道", "青森県", "巖手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県",
        "栃木県", "羣馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県",
        "石川県", "福井県", "山梨県", "長野県", "岐阜県", "靜岡県", "愛知県", "三重県",
        "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県",
        "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県",
        "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"
    ]
    
    /// 性別リスト
    static let SEX_CODE_LIST = [
        "", 
        "男性", "女性", "その他"
    ]
}
   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章