2017-06-01 60 views
0

我在使用小數位的現有應用程序中有自定義鍵盤。我正在嘗試執行英制測量。自定義鍵盤中的PickerView

所以我刪除了鍵盤的小數點,並添加了一個選擇器視圖,我希望所有可能的分數在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. 我想選擇器與[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()   
    } 

我想象的問題是,我試圖在它存在之前填充它。

這是我如何從其他視圖控制器獲取值。首先我編輯協議看起來像這樣,因此它需要輸入一個字符串。

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在這裏它將值顯示到文本框中。

這就是它的樣子。

enter image description here