gpt4 book ai didi

swift - 自定义键盘中的 PickerView

转载 作者:行者123 更新时间:2023-11-30 12:25:09 24 4
gpt4 key购买 nike

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

所以我从键盘上删除了小数点,并添加了一个选择器 View ,我希望在其中包含 1/32 -> 31/32 之间的所有可能的分数。这就是现在的样子。所有功能均按预期使用 UITextfield,除了选择器(“完成”按钮上方): Custom Keyboard

我无法将 [Strings] 加载到选择器中。以下是我为键盘提供的协议(protocol)和自定义类。

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 中使用此键盘的另一个 View 调用这些协议(protocol)函数。

  1. 我希望选择器填充[Fractions]
  2. 我想了解如何将选择器显示的字符串值存储到我调用它的 View Controller 中的变量中。

我对初始化不太了解,我认为这就是问题所在。抱歉,转储了代码。

最佳答案

所以我解决了显示问题。这只是重新排列代码的问题:

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)编辑为如下所示,因此需要输入字符串。

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

这就是它的样子。

enter image description here

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com