2017-01-10 22 views
0

這裏是應用程序的主屏幕:創建三個pickerViews轉換用的單位

enter image description here

我已經成功連結這些pickerView給對方,然後我試圖來分配計算的轉換,但不以利用:

例如:英里kilo 但我找不到方法來這樣做。我試圖使用「開關」仍然沒有發生。我只需要有人能告訴我如何通過textField將某個單位轉換爲另一個單位。例如,如果您在特定的texField中輸入值,轉換的結果將在其他textField中,反之亦然。

這裏是我的代碼:

import UIKit 

類的ViewController:UIViewController中,UIPickerViewDataSource,UIPickerViewDelegate,UITextFieldDelegate {

@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; 

} 

}

回答

0

我會給你一些提示:

  1. 文本字段中的值是一個字符串,您應該將其轉換爲Double,然後乘以2個單位之間的不同值。
  2. 爲了保存這些不同的值,我有一個想法:保存[「英里」,「圍場」,「腳」,「英寸」等[1,1760,5280,63360,1,609344,1609.344,160934.4,1609344], 「公里」,「米」,「釐米」,「毫米」],然後做一些數學計算。
  3. 您應該聽取每個UITextField的通知UITextFieldTextDidChange以立即計算出相等的值。

如果你是一個懶惰的開發,我發現這對你:https://github.com/michalkonturek/MKUnits

希望這有助於。

0

我會做這樣的事情,作爲不同的長度值的例子:

你想儲存某種陣列的跟蹤轉化值測量的各個不同的單位,最好的萬能長度單位爲米。這將是一個不錯的主意,以確保每個單元的對應值保持靜態,所以創建一個enum

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 
} 

那麼你應該讓你的轉換值的陣列,這是雙重的的基礎上,一個數組長度值I在上面enum轉換所列meters

// 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 
} 

然後,每當用戶在左或右UIPickerView選擇一個新行,更新的計算和處理它,但是你想:

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])" 
} 
+0

那你的意思是你最後的評論: //現在做什麼你需要轉換後的值 –

+0

@Turki M. Alsayed - 然後你將輸入值從pickerA中的單位類型轉換爲pickerB中的單位類型。因此可以說用戶要求將10英尺轉換爲英寸。你的'converted'變量的值應該是'120.0' - 然後你可以更新'UITextField'或者你想用來更新UI的任何標籤來提醒用戶轉換值。例如:'textField.text =「Converted Value:\(converted)」'或者如果它是一個標籤:'label.text =「Converted Value:\(converted)」'等等...... – Pierce

+0

Hello,Mr. Pierce, 我已經完成了上面的解釋,我只爲「長度」做了確保我遵循正確的路線。不幸的是,當我從subLength前面挑選任何東西時,我在左右兩邊的文本字段中獲得了「Nan」。 我做了以下工作: 您的合作非常感謝。 if(textFieldLeft.text?.isEmpty)! { textFieldLeft.text = 「\(經換算)」 }否則{ textFielfRight.text = 「\(經換算)」 } –