キーボード上部にセグメントセレクタを入れる


キーボードから数値などを入れる時に、技術的なアイテムの場合単位を入れる必要がある場合があります。たとえば、重さなら、g, kg とか周波数なら、Hz, kHz, MHz などです。この単位の接頭辞によって実際に数値計算するときに換算をすることになります。
これをフルキーボードから入力させてもよいのですが、するとアルファベットと数字が混在して面倒です。
この単位をボタンにしてもよいのですが、今回これをセグメントセレクタにしてキーボードの上部に表示させるようにしてみました。
以下の例では、単位のセグメントセレクタと前と次のフィールドへの移動、終了のボタンも一緒に設定しています。
セグメントセレクタは設定時に初期値に設定し、これに対応した変数を設定しておいて、変更されたら、メソッドでそれを読み出して対応する変数を対応させるようにしました。
例では２つのフィールドにそれぞれキャパシタンスの単位セグメントと周波数の単位セグメントを設定しています。

Example

    // 定数
    let BTN_PREV = 0
    let BTN_NEXT = 1
    let BTN_DONE = 2
    let capUnits = ["pF", "nF", "µF"]
    let freqUnits = ["Hz", "kHz", "MHz"]

    
    @IBOutlet weak var myField1: UITextField!   // 入力テキストフィールド
    @IBOutlet weak var myField2: UITextField!   // メッセージ表示フィールド
    
    var capunitIndex = 0                        // 単位セグメントインデクス
    var frequnitIndex = 0
    

    override func viewDidLoad() {
        super.viewDidLoad()

        // ボタン設定
        func makeUnitButton (unitNames: [String]) -> UIView {
            var _unitSegment: UISegmentedControl?
            
            let unitKeyboard = UIView(frame: CGRectMake(0, 0, 320, 40))
            unitKeyboard.backgroundColor = UIColor.lightGrayColor()
            
            // セグメントコントロール作成
            if unitNames.count > 0 {
                _unitSegment = UISegmentedControl(frame: CGRectMake(10, 5, 150, 30))
                _unitSegment!.backgroundColor = UIColor.whiteColor()
                for var i = 0; i < unitNames.count ; i++ {
                    _unitSegment!.insertSegmentWithTitle(unitNames[i], atIndex: i , animated: true)
                }
                _unitSegment!.selectedSegmentIndex = 0
                _unitSegment!.addTarget(self, action: "onKeySegment:", forControlEvents: UIControlEvents.ValueChanged)
                unitKeyboard.addSubview(_unitSegment!)
            }
            
            // Previous ボタン作成
            let prevButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
            prevButton.frame = CGRectMake(180, 5, 30, 30)
            prevButton.backgroundColor = UIColor.whiteColor()
            prevButton.setTitle("<", forState: UIControlState.Normal)
            prevButton.tag = BTN_PREV
            prevButton.addTarget(self, action: "onKeyButton:", forControlEvents: UIControlEvents.TouchUpInside)
            
            // Next ボタン作成
            let nextButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
            nextButton.frame = CGRectMake(220, 5, 30, 30)
            nextButton.backgroundColor = UIColor.whiteColor()
            nextButton.setTitle(">", forState: UIControlState.Normal)
            nextButton.tag = BTN_NEXT
            nextButton.addTarget(self, action: "onKeyButton:", forControlEvents: UIControlEvents.TouchUpInside)
            
            // Done ボタン作成
            let doneButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
            doneButton.frame = CGRectMake(270, 5, 40, 30)
            doneButton.backgroundColor = UIColor.whiteColor()
            doneButton.setTitle("Done", forState: UIControlState.Normal)
            doneButton.tag = BTN_DONE
            doneButton.addTarget(self, action: "onKeyButton:", forControlEvents: UIControlEvents.TouchUpInside)
            
            unitKeyboard.addSubview(prevButton)
            unitKeyboard.addSubview(nextButton)
            unitKeyboard.addSubview(doneButton)
            
            return unitKeyboard
        }
        
        
        let _capKeyboard = makeUnitButton(capUnits)
        
        
        let freqKeyboard = makeUnitButton(freqUnits)
        
        myField1.keyboardType = UIKeyboardType.DecimalPad
        myField1.inputAccessoryView = _capKeyboard
        myField1.delegate = self
        
        myField2.keyboardType = UIKeyboardType.DecimalPad
        myField2.inputAccessoryView = freqKeyboard
        myField2.delegate = self
        
        
        
        
    }
    // セグメントメソッド
    func onKeySegment(sender: UISegmentedControl) {
        if myField1.editing {
            capunitIndex = sender.selectedSegmentIndex
        } else if myField2.editing {
            frequnitIndex = sender.selectedSegmentIndex
        }
    }

    // ボタンメソッド
    func onKeyButton(sender: UIButton) {
        if myField1.editing {
            myField1.text = myField1.text + capUnits[capunitIndex]
            switch sender.tag {
            case BTN_PREV:
                myField1.resignFirstResponder()
                myField2.becomeFirstResponder()
            case BTN_NEXT:
                myField1.resignFirstResponder()
                myField2.becomeFirstResponder()
            case BTN_DONE:
                self.view.endEditing(true )
            default:
                break
            }
        } else if myField2.editing {
            myField2.text = myField2.text + freqUnits[frequnitIndex]
            switch sender.tag {
            case BTN_PREV:
                myField2.resignFirstResponder()
                myField1.becomeFirstResponder()
            case BTN_NEXT:
                myField2.resignFirstResponder()
                myField1.becomeFirstResponder()
            case BTN_DONE:
                self.view.endEditing(true)
            default:
                break
            }
        }
    }

    
    // リターンキーでのデリゲートメソッド
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        self.view.endEditing( true )
        return false
    }