0

我正在尝试开发一个功能,其中用户在 TextField 中输入一个数字,并根据选择器的选择,它将计算数字并将其显示在标签或另一个文本字段中。现在请记住,选择器必须保留字符串标题,但每行会有不同的数字。

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, 
UIPickerViewDataSource {

@IBOutlet weak var numberInput: UITextField!
@IBOutlet weak var pickerControl: UIPickerView!
@IBOutlet weak var pickerControl2: UIPickerView!
@IBOutlet weak var resultField: UILabel!


var pickerData = ["Logistic","Administration","Clinic"]
var pickerData2 = ["Days","Weeks","Months"]

override func viewDidLoad() {
        super.viewDidLoad()
        pickerControl.delegate = self
        pickerControl2.delegate = self
        pickerControl.delegate = self
        pickerControl2.delegate = self




}


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

func pickerView(_ pickerView: UIPickerView, 
numberOfRowsInComponent component: Int) -> Int {

        if pickerView == pickerControl {
            return pickerData.count
        } else if pickerView == pickerControl2 {
            return pickerData2.count
        }
        return 1
    }
    

func pickerView(_ pickerView: UIPickerView, titleForRow row: 
Int, forComponent component: Int) -> String? {
        if pickerView == pickerControl {
            return pickerData[row]
        } else if pickerView == pickerControl2 {
            return pickerData2[row]
        }
        return ""
    }

func pickerView(_ pickerView: UIPickerView, didSelectRow row: 
Int, inComponent component: Int) -> String? {
let entry = Float(numberInput.text!) ?? 0.0
    if pickerView == pickerControl {
    return (Array(pickerData)[row])
    }
    
    if pickerView == pickerControl2 {
if Array(pickerData2)[row] == "Days" {
    self.resultField.text = String(entry * 3)
}
if Array(pickerData2)[row] == "Weeks" {
    self.resultField.text = String(entry * 4)
}
if Array(pickerData2)[row] == "Months" {
self.resultField.text = String(entry * 6)
}
    return Array(pickerData2)[row]
    }

return ""
}




}
4

1 回答 1

0

的函数签名pickerView(didSelect...)不正确,因此没有被调用。你会看到 Xcode 给你一个警告。该函数不应该返回任何东西。

这是如何更改它的示例:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        
        let entry = Float(numberInput.text ?? "") ?? 0.0
        if pickerView == pickerControl {
            return
        }
        
        switch pickerData2[row] {
        case "Days":
            self.resultField.text = String(entry * 3)
        case "Weeks":
            self.resultField.text = String(entry * 4)
        case "Months":
            self.resultField.text = String(entry * 6)
        default:
            break
        }
    }

你会注意到我还使用了一个switch声明,我认为它看起来更简洁一些。但是,如果你没有并且坚持你的if/else,你就不必使用Array()所有的东西——你可以做类似的事情if pickerControl2[row] == "Days" { }


您可以通过定义为进一步清理pickerData2

var pickerData2 : [(title: String, value: Float)] = [(title: "Days",value: 3),(title: "Weeks",value: 4),(title: "Months", value:6)]

那么,在 中titleForRow,你可以return pickerData2[row].title

后来,在didSelectRow

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    
    let entry = Float(numberInput.text ?? "") ?? 0.0
    if pickerView == pickerControl {
        return
    }
    
    self.resultField.text = String(entry * pickerData2[row].value)
}
于 2021-06-18T19:03:10.177 回答