使用 UIPickerView 和 UITextField 进行计算

Calculations with UIPickerView and UITextField

我正在开发一个应用程序,用户在其中输入一个文本字段值,然后将该值乘以存储在 UIPickerView 的 didSelectRow 方法中的值。这目前有效,但只有当我输入值和 touch/select 选择器时才有效。一旦将值输入到文本字段中,我如何才能对选定的行执行计算?谢谢。

    class Example2ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate  {

    @IBOutlet weak var inputField: UITextField!
    @IBOutlet weak var resultsLabel: UILabel!
    @IBOutlet weak var calcLabel: UILabel!
    @IBOutlet weak var myPicker: UIPickerView!

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

    override func viewDidLoad() {
        super.viewDidLoad()

        myPicker.delegate = self
        myPicker.dataSource = self
        self.resultsLabel.text = ""
        self.calcLabel.text = ""
        pickerData = ["Item 1", "Item 2", "Item 3","Item 4", "Item 5", "Item 6"]
        myPicker.selectRow(1, inComponent: 0, animated: true)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        print(string)
        return true
    }

    @IBAction func  editingChanged(sender: UITextField) {
        sender.text = sender.text?.uppercaseString
        inputField.text = sender.text
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?){
        view.endEditing(true)
        super.touchesBegan(touches, withEvent: event)
    }
    //UI Pickerview

    // The number of columns of data
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    // The number of rows of data
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    // The data to return for the row and component (column) that's being passed in
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerData[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        var multiplicator : Double = 1.0
        if (row == 0)
        {
            resultsLabel.text = "Item 1"
            multiplicator = 1.00
        }
        else if (row == 1)
        {
            resultsLabel.text = "Item 2"
            multiplicator = 2.00
        }
        else if (row == 2)
        {
            resultsLabel.text = "Item 3"
            multiplicator = 3.00
        }
        else if (row == 3)
        {
            resultsLabel.text = "Item 4"
            multiplicator = 4.00
        }
        else if (row == 4)
        {
            resultsLabel.text = "Item 5"
            multiplicator = 5.00
        }
        else if (row == 5)
        {
            resultsLabel.text = "Item 6"
            multiplicator = 6.00
        }

        let result = multiplicator * (inputField.text! as NSString).doubleValue
        calcLabel.text = "Results: \(result)"
    }


}

您可以通过将 multiplicator 设为全局变量来实现此目的,然后您可以在文本字段函数中使用它:

 var multiplicator:Double!

@IBAction func editingChanged(sender: UITextField) {
        sender.text = sender.text?.uppercaseString
        inputField.text = sender.text
        let result = multiplicator * (inputField.text! as NSString).doubleValue
        calcLabel.text = "Results: \(result)"
    }

您现在显然可以删除 pickerview func 中的最后两行代码

除了全局变量之外,我还通过将 UIPickerView if 语句添加到它自己的函数中来实现此功能。现在我可以在任何需要的地方调用它。

我正在使用以下方法从 inputField 实时更新 calcLabel:

inputField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

func textFieldDidChange(textField: UITextField) {
    pickerFunc()
}

我试过更简单的方法。编辑完成后,我对 UItextField 进行了 @IBAction 调用,然后我在那里进行了所有 post 选择器选择。

@IBAction func textField_pickerAction(_ sender: Any) {
let row = picker.selectedRow(inComponent: 0)
...
...
...
}