我在使用小数位的现有应用程序中有一个自定义键盘。我正在尝试进行英制测量。

因此,我从键盘上删除了小数点,并添加了一个选择器视图,在该视图中我希望所有可能的分数都在1/32-> 31/32之间。
这就是现在的样子。除了选择器(“完成”按钮上方)之外,所有功能都可以按预期与UITextfield一起使用:
swift - 自定义键盘中的PickerView-LMLPHP

我无法将[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中使用此键盘的视图调用这些协议功能。


我希望选择器填充[Fractions]
我想了解如何将选择器显示的字符串值存储到我从中调用它的视图控制器中的变量中。


我对初始化的理解并不充分,这正是我想象的问题所在。对不起,代码转储。

最佳答案

所以我做了显示。只需重新排列代码即可:

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函数会将字符串发送给协议,然后将其发送到ViewController中,在ViewController中,它将值显示在文本字段中。

这就是它的样子。

swift - 自定义键盘中的PickerView-LMLPHP

关于swift - 自定义键盘中的PickerView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44305864/

10-11 21:56
查看更多