ここ

2017-01-10 8 views
0

単位を変換するための3つのpickerViewsを作成するアプリケーションのメイン画面である:ここ

enter image description here

Iは、私は変換の演算を割り当てる試みたがいない、互いにこれらpickerViewを正常にリンクしています利用できる:

例:マイルto killo しかし、私はそうする方法を見つけることができませんでした。私はまだ何も起こらない "スイッチ"を使用しようとしている。私は誰かが私にどのように特定のユニットから別のユニットにtextFieldsを介して変換することができます表示する必要があります。たとえば、特定の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. [Mile、Yard、Foot、Inch]の[1,1760,5280,63360,1.609344,1609.344,160934.4,1609344]を保存して、 "キロメートル"、 "メーター"、 "センチメートル"、 "ミリメートル"]いくつかの数学caculatingを行います。
  3. 各UITextFieldの通知UITextFieldTextDidChangeを聞いて、即座に等しい値を計算する必要があります。

あなたが怠惰な開発者であれば、私はあなたのためにこれを見つけた:https://github.com/michalkonturek/MKUnits

は、この情報がお役に立てば幸いです。私は、異なる長さの値のための一例として、このような何かをするだろう

0

あなたは、測定のそれぞれの異なる単位の変換値を追跡する配列のいくつかの並べ替えを保存したい、最高の普遍的な長さの単位はメートルです。その後、コンバージョンの値のあなたの配列を作る必要があり、これはに基づいて、二重の配列です

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 
} 

を:各ユニットに対応する値は、静的なまま確認するために、良いアイデア、そうenumを作成します私はmetersへの変換について上記enumに記載されている長さ値:

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

// 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"] 

そして、いくつかの変換メソッドを作成します

ユーザーは、左または右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フィートのインチへの変換を要求したとしましょう。あなたの '変換された'変数は '120.0'の値を持つべきです - あなたは' UITextField'またはUIを更新するために使用するラベルを更新して、変換された値をユーザーに警告します。例: 'textField.text ="変換された値:\(変換された) "またはラベルの場合:' label.text = "変換された値:\(変換された)"など... – Pierce

+0

Hello Mr. Pierce、 私はあなたが上で説明したことを正確に行いました、私は正しい道をたどっていることを確かめるために "長さ"だけをしました。残念なことに、私がsubLength ex:inchから何かを選ぶと、テキストフィールドの左右に "Nan"が表示されます。 私は以下を行った: あなたの協力は大変ありがたいことです。 if(textFieldLeft.text?.isEmpty)! { textFieldLeft.text = "\(変換)" }私は正確にMacBook Proの中に単位変換のように実行する必要があり –