2017-06-01 17 views
0

小数点を使用する既存のアプリケーションにカスタムキーボードがあります。私は帝国の測定を実装しようとしています。カスタムキーボードのPickerビュー

私はキーボードから小数点を削除し、1/32 - > 31/32の間に可能な分数をすべて取りたいピッカービューを追加しました。 これは今のようです。ピッカー(「完了」ボタンの上)を除いて、すべての機能がUITextfieldで正常に機能します。 Custom Keyboard

ピッカーに[Strings]をロードできません。以下は、キーボード用に持っているプロトコルとカスタムクラスです。

protocol imperialDelegate: class { 
    func iKeyWasTapped(_ character: String) 
    func iKeyDone() 
    func iBackspace() 
    func iKeyCalc() 
    func iFraction() 
} 

class imperial: UIView, UIPickerViewDelegate, UIPickerViewDataSource { 

    @IBOutlet weak var picker: UIPickerView! 

    var pickerData: [String] = [String]() 

    let fractions = ["1/32","1/16","3/32","1/8","5/32","3/16","7/32","1/4","9/32", 
        "5/16","11/32","3/8","13/32","7/16", "15/32","1/2","17/32", 
        "9/16", "19/32","5/8","21/32","11/16", "23/32","6/8","25/32", 
        "13/16","27/32", "7/8","29/32","15/16","31/32"] 

    // MARK:- keyboard initialization 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.picker.delegate = self 
     self.picker.dataSource = self 
     initializeSubviews() 
     picker.reloadAllComponents() 
     picker.reloadInputViews() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initializeSubviews() 
    } 

    func initializeSubviews() { 
     let xibFileName = "imperialKeyboard" 
     let view = Bundle.main.loadNibNamed(xibFileName, owner: self, options: nil)?[0] as! UIView 
     self.addSubview(view) 
     view.frame = self.bounds 
    } 

    // MARK:- Button actions from .xib file 

    @IBAction func keyTapped(_ sender: UIButton) { 
     self.delegate?.iKeyWasTapped(sender.titleLabel!.text!) 
    } 

    @IBAction func backspace(_ sender: UIButton) { 
     self.delegate?.iBackspace() 
    } 

    @IBAction func Done(_ sender: UIButton) { 
     self.delegate?.iKeyDone() 
    } 

    @IBAction func keyCalc(_ sender: UIButton) { 
     self.delegate?.iKeyCalc() 
    } 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return fractions.count 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return fractions[row] 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     self.delegate?.iFraction() 
    } 
} 

私はUITextFieldsにこのキーボードを使用して別のビューからこれらのプロトコル機能を呼び出します。

  1. 私はピッカーが、私はピッカーが、私はからそれを呼び出していますのViewControllerに変数に表示される文字列値を格納する方法を理解したいと思います[Fractions]
  2. に移入します。

私は問題があると想像している初期化を十分に理解していません。コードをダンプして申し訳ありません。

+0

私はこれが唯一の問題であるとは言わないよ、私はテキストは、その中に収まらない場合は、ピッカーコントローラが表示されないことがわかりました。 "32"を使用して表示してください。そこから築き上げてください。 – Mozahler

答えて

0

私はディスプレイを作りました。私は、問題は、私はそれが存在していた前に、それを埋めるためにしようとしていたということでした想像

required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initializeSubviews() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initializeSubviews() 

     self.picker.delegate = self 
     self.picker.dataSource = self 
     picker.reloadAllComponents() 
     picker.reloadInputViews()   
    } 

:それは、コードを並べ替えるだけの問題でした。

これは、他のView Controllerから値を取得する方法です。まず、このようにプロトコルを編集して、文字列を入力する必要があります。

protocol imperialDelegate: class { 
    func iKeyWasTapped(_ character: String) 
    func iKeyDone() 
    func iBackspace() 
    func iKeyCalc() 
    func iFraction(_ character: String) 
} 

その後pickerviewのdidSelectRow機能は次のようになります。

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    self.delegate?.iFraction(fractions[row]) 
} 

そして、残されたものはすべて、カスタムキーボード上の値がテキストフィールドを送ることができるようにのViewControllerで関数を呼び出すことでしたそのように:あなたはピッカーの値に着陸するとき

func iFraction(_ character: String) { 
    for tf in textFields { 
     tf.insertText(character) 
    } 
} 

ので、didSelectRow機能は、プロトコルに文字列を送信し、これはその後ViewContrに送られ、 ollerここで値をテキストフィールドに表示します。

これは見た目です。

enter image description here

関連する問題