Swift3 创建三个PickerView以转换单位

Swift3 创建三个PickerView以转换单位,swift3,ios10,units-of-measurement,Swift3,Ios10,Units Of Measurement,以下是应用程序的主屏幕: 我已成功地将这些pickerView相互链接,然后我尝试在转换中分配计算,但无效: 从一英里到基洛 但我找不到这样做的方法。我尝试过使用“开关”,但仍然没有发生任何事情。我只需要有人能告诉我如何通过文本字段将某个单位转换成另一个单位。例如,如果在某个文本字段中输入值,则转换后的结果将在另一个文本字段中显示,反之亦然 这是我的密码: import UIKit 类ViewController:UIViewController、UIPickerViewDataSo

以下是应用程序的主屏幕:

我已成功地将这些pickerView相互链接,然后我尝试在转换中分配计算,但无效:

从一英里到基洛 但我找不到这样做的方法。我尝试过使用“开关”,但仍然没有发生任何事情。我只需要有人能告诉我如何通过文本字段将某个单位转换成另一个单位。例如,如果在某个文本字段中输入值,则转换后的结果将在另一个文本字段中显示,反之亦然

这是我的密码:

    import UIKit
类ViewController:UIViewController、UIPickerViewDataSource、UIPickerViewDeleteGate、UIExtFieldDelegate{

@IBOutlet weak var mainPicker: UIPickerView!
@IBOutlet weak var leftPicker: UIPickerView!
@IBOutlet weak var rightPicker: UIPickerView!
@IBOutlet weak var textFieldLeft: UITextField!
@IBOutlet weak var textFielfRight: UITextField!
@IBOutlet weak var equal: UILabel!


var leftPickerData : [String] = []
var rightPickerData : [String] = []

var dataDict:NSMutableDictionary!
var mainPickerData:NSArray!
var leftRightPickerData:NSArray!

//yourPicker.backgroundColor = UIColor(patternImage: UIImage(named: "back.jpg")!)


override func viewDidLoad() {
    super.viewDidLoad()

    mainPicker.backgroundColor = .clear
    rightPicker.backgroundColor = .clear
    leftPicker.backgroundColor = .clear

    // Connect data to ViewController ..
    self.mainPicker.delegate = self
    self.mainPicker.dataSource = self

    self.leftPicker.delegate = self
    self.leftPicker.dataSource = self

    self.rightPicker.delegate = self
    self.rightPicker.dataSource = self

    self.textFieldLeft.delegate = self
    self.textFielfRight.delegate = self

    let theWidth = view.frame.size.width
    let theHeight = view.frame.size.height

    mainPicker.center = CGPoint(x: theWidth/2, y: theHeight/2 - 182.5)
    leftPicker.center = CGPoint(x: theWidth/2 - 100, y: theHeight/2)
    rightPicker.center = CGPoint(x: theWidth/2 + 100, y: theHeight/2)
    textFieldLeft.center = CGPoint(x: theWidth/2 - 90, y: theHeight/2 + 110)
    textFielfRight.center = CGPoint(x: theWidth/2 + 90, y: theHeight/2 + 110)
    equal.center = CGPoint(x: theWidth/2, y: theHeight/2 + 110)



    dataDict = ["Area":["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"]
        ,"Energy":["Btus", "Calories", "Ergs", "Foot-Pounds", "Joules", "Kilogram-Calories", "Kilogram-Meters", "Kilowatt-Hours", "Newton-Meters", "Watt-Hours"], "Length":["Mile", "Yard", "Foot", "Inch", "Kilometer", "Meter", "Centimeter", "Millimeter"], "Power": ["Btus/Minute", "Foot-Pounds/Min", "Foot-Pounds/Sec", "Horsepower", "Kilowatts", "Watts"], "Pressure": ["Pounds/Sqr Ft", "Pounds/Sqr In", "Atmospheres", "Bars", "In of Mercury", "Cm of Mercury", "Kilograms/Sqr Meter", "Pascals"], "Speed": ["Knots", "Miles/Hr", "Miles/Min", "Feet/Min", "Feet/Sec", "Kilometers/Hr", "Kilometer/Min", "Meters/Sec"], "Temperature": ["Celsius C˚", "Fahrenheit", "Kelvin"], "Time": ["Years", "Months", "Weeks", "Days", "Hours", "Minutes", "Seconds", "Millisconds", "Microseconds", " Nanoseconds"], "Volume": ["Cupic Feet","Cubic Meter", "Gallon (Imp)", "Gallon (US)", "Quart (US)", "Pint (US)", "Fluid Oz", "Cup", "Tablespoon", "Teaspoon", "Dram (US)", "Liter"], "Weight": ["Short Ton (US)","Long Ton (UK)", "Pound (U.S)", "Ounce (US)", "Stone", "Metric Ton", "Kilogram", "Gram"]]
    mainPickerData = dataDict.allKeys as NSArray!;
    leftRightPickerData = dataDict.object(forKey: mainPickerData.firstObject as! String) as! NSArray

    // Linking the textFields with the pickerViews.
    //textFieldLeft.inputView = leftPicker;
   // textFielfRight.inputView = rightPicker;



    }



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

// The number of rows of data
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    switch (pickerView.tag) {

    case mainPicker.tag:

        return mainPickerData.count

    case leftPicker.tag,rightPicker.tag:

        let currentSelectedIndex = mainPicker.selectedRow(inComponent: component)
        leftRightPickerData = (dataDict.object(forKey: mainPickerData[currentSelectedIndex] as! String) as! NSArray)

        return leftRightPickerData.count;

    default:
        break;
    }
    return 0;
}

// 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? {

    if leftPicker.tag == 2 {

        return leftPickerData[row]

    }else if rightPicker.tag == 3{

        return rightPickerData[row]

    }

    return ""
}

// Catpure the picker view selection
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    // This method is triggered whenever the user makes a change to the picker selection.
    // The parameter named row and component represents what was selected.

    if(pickerView.tag == 1 ){

        let currentSelectedIndex = mainPicker.selectedRow(inComponent: component)
        leftRightPickerData = (dataDict.object(forKey: mainPickerData[currentSelectedIndex] as! String) as! NSArray)

        leftPicker.reloadAllComponents()
        rightPicker.reloadAllComponents()

        if mainPicker.tag == mainPicker.selectedRow(inComponent: component) {

            if leftPicker.tag == leftPicker.selectedRow(inComponent: component) && rightPicker.tag == rightPicker.selectedRow(inComponent: component){

                textFieldLeft.text = textFielfRight.text
            }
        }

    }



}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    self.view.endEditing(true)

}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textFieldLeft.resignFirstResponder()
    textFielfRight.resignFirstResponder()

    return true

}

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {

    let titleData : String?
    if(pickerView.tag == mainPicker.tag){
        titleData = mainPickerData[row] as? String;

    }
    else{

        let currentSelectedIndex = mainPicker.selectedRow(inComponent: 0)
        leftRightPickerData = (dataDict.object(forKey: mainPickerData[currentSelectedIndex] as! String) as! NSArray)

        titleData = leftRightPickerData[row] as? String;
    }

    let myTitle = NSAttributedString(string: titleData!, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 12.0)!,NSForegroundColorAttributeName:UIColor.blue])
    return myTitle;

}
@IBOutlet弱var主选择器:UIPickerView!
@IBVAR leftPicker:UIPickerView!
@IBV弱var rightPicker:UIPickerView!
@IBOutlet弱var textfield左:UITextField!
@IBOutlet弱var textFielfRight:UITextField!
@IBOutlet弱var相等:UILabel!
var leftPickerData:[字符串]=[]
var rightPickerData:[字符串]=[]
var dataDict:NSMutableDictionary!
var mainPickerData:NSArray!
var leftRightPickerData:NSArray!
//yourPicker.backgroundColor=UIColor(patternImage:UIImage(名为:“back.jpg”)!)
重写func viewDidLoad(){
super.viewDidLoad()
mainPicker.backgroundColor=.clear
rightPicker.backgroundColor=.clear
leftPicker.backgroundColor=.clear
//将数据连接到ViewController。。
self.mainPicker.delegate=self
self.mainPicker.dataSource=self
self.leftPicker.delegate=self
self.leftPicker.dataSource=self
self.rightPicker.delegate=self
self.rightPicker.dataSource=self
self.textFieldLeft.delegate=self
self.textFielfRight.delegate=self
让宽度=view.frame.size.width
让高度=view.frame.size.height
main picker.center=CGPoint(x:宽度/2,y:高度/2-182.5)
leftPicker.center=CGPoint(x:theWidth/2-100,y:theheheight/2)
right picker.center=CGPoint(x:宽度/2+100,y:高度/2)
textfield left.center=CGPoint(x:theWidth/2-90,y:height/2+110)
textFielfRight.center=CGPoint(x:宽度/2+90,y:高度/2+110)
equal.center=CGPoint(x:宽度/2,y:高度/2+110)
dataDict=[“面积”:[“平方英里”、“平方码”、“平方英尺”、“平方英寸”、“公顷”、“英亩”、“平方公里”、“平方米”、“平方厘米”、“平方毫米”]
,“能量”:[“Btus”、“卡路里”、“Ergs”、“英尺磅”、“焦耳”、“千克卡路里”、“千克米”、“千瓦时”、“牛顿米”、“瓦特小时”],“长度”:[“英里”、“码”、“英尺”、“英寸”、“公里”、“米”、“厘米”、“毫米”],“功率”:[“Btus/分钟”、“英尺磅/分钟”、“英尺磅/秒”、“马力”、“千瓦”、“瓦特”],“压力”:[“磅/平方英尺”、“磅/平方英尺”、“大气”、“巴”、“水银英寸”、“水银厘米”、“千克/平方米”、“帕斯卡”],“速度”:[“节”、“英里/小时”、“英里/分钟”、“英尺/分钟”、“英尺/秒”、“公里/小时”、“公里/分钟”、“米/秒”],“温度”:[“摄氏度”、“华氏度”、“开尔文”],“时间”:[“年”、“月”、“周”“天”、“小时”、“分钟”、“秒”、“毫秒”、“微秒”、“纳秒”]、“体积”:[“铜英尺”、“立方米”、“加仑(英制)”、“加仑(US)”、“夸脱(US)”、“品脱(US)”、“液体盎司”、“杯子”、“汤匙”、“茶匙”、“德拉姆(US)”、“升”]、“重量”:[“短吨(US)”、“长吨(UK)”、“磅(US)”、“盎司(US)”、“石头”、“公吨”、”千克“,”克“]]
mainPickerData=dataDict.allKeys作为NSArray!;
leftRightPickerData=dataDict.object(forKey:mainPickerData.firstObject as!String)as!NSArray
//将文本字段与pickerViews链接。
//textFieldLeft.inputView=leftPicker;
//textFielfRight.inputView=rightPicker;
}
//数据的列数
func numberOfComponents(在pickerView:UIPickerView中)->Int{
返回1
}
//数据的行数
func pickerView(pickerView:UIPickerView,numberOfRowsInComponent:Int)->Int{
开关(pickerView.tag){
case mainPicker.tag:
返回mainPickerData.count
大小写leftPicker.tag,rightPicker.tag:
让currentSelectedIndex=mainPicker.selectedRow(不完整:组件)
leftRightPickerData=(dataDict.object(forKey:mainPickerData[currentSelectedIndex]as!String)as!NSArray)
返回leftRightPickerData.count;
违约:
打破
}
返回0;
}
//要为传入的行和组件(列)返回的数据
func pickerView(pickerView:UIPickerView,titleForRow行:Int,forComponent组件:Int)->String{
如果leftPicker.tag==2{
返回leftPickerData[行]
}如果rightPicker.tag==3,则为else{
返回rightPickerData[行]
}
返回“”
}
//Catpure选择器视图选择
func pickerView(pickerView:UIPickerView,didSelectRow行:Int,不完整组件:Int){
//每当用户更改选择器选择时,就会触发此方法。
//名为row and component的参数表示所选内容。
if(pickerView.tag==1){
让currentSelectedIndex=mainPicker.selectedRow(不完整:组件)
leftRightPickerData=(dataDict.object(forKey:mainPickerData[currentSelectedIndex]as!String)as!NSArray)
leftPicker.reloadAllComponents()的
rightPicker.reloadAllComponents()
如果mainPicker.tag==mainPicker.selectedRow(不完整:组件){
如果leftPicker.tag==leftPicker.selectedRow(不完整:组件)和&rightPicker.tag==rightPicker.selectedRow(不完整:组件){
textFieldLeft.text=textFielfRight.text
}
}
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
func textField应该返回(textField:UITextField)->Bool{
textFieldLeft.resignFirstResponder()辞职
textFielfRight.resignF
enum Length: Int {
    case mile           = 0
    case yard           = 1
    case foot           = 2
    case inch           = 3
    case kilometer      = 4
    // ... keep going with all lenght units of measurement
}
// Store values with corresponding indicies in array to the Length enum's values
let meterConversions:[Double] = [1609.34, 0.9144, 0.3048, 0.0254, 1,000]

// Store values of length unit descriptions to print after conversion in TextField, long hand or short hand whatever you prefer. (this is optional)
let lengthUnits = ["Mile", "Yard", "Foot", "Inch", "Kilometer"]
// Convert length type to meters
func convertToMeters(type: Length, unitValue: Double) -> Double {
    return (meterConversions[type.rawValue] * unitValue)
}

// Convert meters back to length type
func convertFromMeters(type: Length, meterValue: Double) -> Double {
    return meterValue/meterConversions[type.rawValue]
}

// Convert from length type to other length type
func convertType(from: Length, to: Length, unitValue: Double) -> Double {

    // Convert from value to meters to start
    let fromValueToMeters:Double = convertToMeters(type: from, unitValue: unitValue)

    // Now use that value to convert back to desired unit
    let newUnitValue:Double = convertFromMeters(type: to, meterValue: fromValueToMeters)

    return newUnitValue
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    // Make sure there is actually some text in the left text field, otherwise return
    guard let text = textFieldLeft.text else { print("textFieldLeft doesn't contain any text"); return }

    // You are going to need a numerical (Double) value from the user's text
    let stringAsDouble = Double(text)

    // Now check that the text was actually a numerical value able to be converted to a double
    if let value = stringAsDouble {

        var typeA:Length!
        var typeB:Length!

        if pickerView == leftPicker {
            typeA = Length(rawValue: row)!
            typeB = Length(rawValue: rightPicker.selectedRow(inComponent: 0))!
            converted = convertType(from: typeA, to: typeB, unitValue: value)
        }
        else if pickerView == rightPicker {
            typeA = Length(rawValue: leftPicker.selectedRow(inComponent: 0))!
            typeB = Length(rawValue: row)!
            let value:Double = 0 // Determine user entered value from textField
            converted = convertType(from: typeA, to: typeB, unitValue: value)
        }

        updateValueAfterConversion(originalValue: value, originalType: typeA, convertedValue: converted, convertedType: typeB)
    } else {
        print("Couldn't convert text to double value")
    }
}

func updateValueAfterConversion(originalValue: Double, originalType: Length, convertedValue: Double, convertedType: Length) {
    // Update text in both fields, lengthUnits part is optional if you want to print unit along with value.
    // Update text on left side
    textFieldLeft.text = "\(originalValue) \(lengthUnits[originalType.rawValue])"
    // Update text on right side
    textFieldRight.text = "\(convertedValue) \(lengthUnits[convertedType.rawValue])"
}