Easy interface Currency Converter for iOS

This commit is contained in:
2018-08-25 00:51:49 -07:00
parent cb8d38cf0a
commit 730c335f63
49 changed files with 9485 additions and 5 deletions

View File

@@ -1,14 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="easyCC" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
@@ -16,11 +21,96 @@
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="52C-6q-x8K">
<rect key="frame" x="16" y="28" width="343" height="30"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
<connections>
<outlet property="delegate" destination="BYZ-38-t0r" id="R0M-rb-xZv"/>
</connections>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Insert Currency One" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="s4Z-H2-NTI">
<rect key="frame" x="16" y="66" width="343" height="30"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad"/>
<connections>
<action selector="textFieldChangeListener:" destination="BYZ-38-t0r" eventType="editingChanged" id="P5a-Ve-5DY"/>
<outlet property="delegate" destination="BYZ-38-t0r" id="Qbr-AB-HET"/>
</connections>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="gOb-AC-a8R">
<rect key="frame" x="16" y="104" width="343" height="30"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
<connections>
<outlet property="delegate" destination="BYZ-38-t0r" id="WXh-gB-ZBs"/>
</connections>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Insert Currency Two" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="s84-D2-Z6S">
<rect key="frame" x="16" y="142" width="343" height="30"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad"/>
<connections>
<action selector="textChangeListenerTwo:" destination="BYZ-38-t0r" eventType="editingChanged" id="HbP-Ba-w32"/>
<outlet property="delegate" destination="BYZ-38-t0r" id="886-rA-OY8"/>
</connections>
</textField>
<pickerView tag="1" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yUx-aC-4ek">
<rect key="frame" x="16" y="66" width="343" height="216"/>
<connections>
<outlet property="dataSource" destination="BYZ-38-t0r" id="BEc-sB-ERF"/>
<outlet property="delegate" destination="BYZ-38-t0r" id="ap9-xn-69a"/>
</connections>
</pickerView>
<pickerView tag="2" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="t8J-WK-23N">
<rect key="frame" x="16" y="142" width="343" height="216"/>
<connections>
<outlet property="dataSource" destination="BYZ-38-t0r" id="8WA-hD-Udv"/>
<outlet property="delegate" destination="BYZ-38-t0r" id="YD2-WJ-bWm"/>
</connections>
</pickerView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="gOb-AC-a8R" firstAttribute="top" secondItem="s4Z-H2-NTI" secondAttribute="bottom" constant="8" id="6SV-fL-Y8u"/>
<constraint firstItem="s84-D2-Z6S" firstAttribute="top" secondItem="gOb-AC-a8R" secondAttribute="bottom" constant="8" id="Cir-UV-QMz"/>
<constraint firstItem="gOb-AC-a8R" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="DF6-aJ-HaO"/>
<constraint firstItem="s84-D2-Z6S" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="EXF-RC-KfF"/>
<constraint firstItem="52C-6q-x8K" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="KwK-8r-TvX"/>
<constraint firstItem="s4Z-H2-NTI" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="NGq-8J-r6P"/>
<constraint firstItem="52C-6q-x8K" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="OqN-xN-xOw"/>
<constraint firstItem="s4Z-H2-NTI" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="RbV-Ds-F3F"/>
<constraint firstItem="yUx-aC-4ek" firstAttribute="top" secondItem="52C-6q-x8K" secondAttribute="bottom" constant="8" id="b4W-eV-L3k"/>
<constraint firstItem="gOb-AC-a8R" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="bjg-rB-FXt"/>
<constraint firstItem="gOb-AC-a8R" firstAttribute="top" secondItem="s4Z-H2-NTI" secondAttribute="bottom" constant="8" id="c77-lI-jFp"/>
<constraint firstItem="t8J-WK-23N" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="cHL-nr-uDQ"/>
<constraint firstItem="s84-D2-Z6S" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="cMG-9W-xEp"/>
<constraint firstItem="t8J-WK-23N" firstAttribute="top" secondItem="gOb-AC-a8R" secondAttribute="bottom" constant="8" id="gRX-x6-Ibq"/>
<constraint firstItem="yUx-aC-4ek" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="jNn-Gf-Hl0"/>
<constraint firstItem="s4Z-H2-NTI" firstAttribute="top" secondItem="52C-6q-x8K" secondAttribute="bottom" constant="8" id="kWx-YV-NXN"/>
<constraint firstItem="52C-6q-x8K" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" constant="8" id="nq1-ii-YE0"/>
<constraint firstItem="t8J-WK-23N" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="pcs-6v-nte"/>
<constraint firstItem="yUx-aC-4ek" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="rac-pG-7fy"/>
<constraint firstItem="t8J-WK-23N" firstAttribute="top" secondItem="gOb-AC-a8R" secondAttribute="bottom" constant="8" id="yyc-QF-HFD"/>
</constraints>
</view>
<connections>
<outlet property="currencyChoiceOne" destination="52C-6q-x8K" id="Xgb-op-nVl"/>
<outlet property="currencyChoiceTwo" destination="gOb-AC-a8R" id="WkE-UE-YZP"/>
<outlet property="inputOne" destination="s4Z-H2-NTI" id="zCa-zX-eVM"/>
<outlet property="inputTwo" destination="s84-D2-Z6S" id="ij0-d7-SrY"/>
<outlet property="spinnerOne" destination="yUx-aC-4ek" id="tVp-B2-jMc"/>
<outlet property="spinnerTwo" destination="t8J-WK-23N" id="t80-9W-uJ2"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="117.59999999999999" y="122.78860569715144"/>
</scene>
</scenes>
</document>

View File

@@ -7,11 +7,37 @@
//
import UIKit
import Alamofire
class ViewController: UIViewController {
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{
@IBOutlet weak var currencyChoiceOne: UITextField!
@IBOutlet weak var inputOne: UITextField!
@IBOutlet weak var currencyChoiceTwo: UITextField!
@IBOutlet weak var inputTwo: UITextField!
@IBOutlet weak var spinnerOne: UIPickerView!
@IBOutlet weak var spinnerTwo: UIPickerView!
var rateOne: String = ""
var rateTwo: String = ""
var exchangeRate: Double = 1
var currencyList = ["AFN - Afghan Afghani","DZD - Algerian Dinar","AOA - Angolan Kwanza","ARS - Argentine Peso","AMD - Armenian Dram","AWG - Aruban Florin","AUD - Australian Dollar","AZN - Azerbaijani Manat","BSD - Bahamian Dollar","BHD - Bahraini Dinar","BDT - Bangladeshi Taka","BBD - Barbadian Dollar","BYR - Belarusian Ruble","BZD - Belize Dollar","BTN - Bhutanese Ngultrum","BTC - Bitcoin","BOB - Bolivian Boliviano","BAM - Bosnia And Herzegovina Konvertibilna Marka","BWP - Botswana Pula","BRL - Brazilian Real","GBP - British Pound","BND - Brunei Dollar","BGN - Bulgarian Lev","BIF - Burundi Franc","KHR - Cambodian Riel","CAD - Canadian Dollar","CVE - Cape Verdean Escudo","KYD - Cayman Islands Dollar","XAF - Central African CFA Franc","XPF - CFP Franc","CLP - Chilean Peso","CNY - Chinese Yuan","COP - Colombian Peso","KMF - Comorian Franc","CDF - Congolese Franc","CRC - Costa Rican Colon","HRK - Croatian Kuna","CUP - Cuban Peso","CZK - Czech Koruna","DKK - Danish Krone","DJF - Djiboutian Franc","DOP - Dominican Peso","XCD - East Caribbean Dollar","EGP - Egyptian Pound","ERN - Eritrean Nakfa","ETB - Ethiopian Birr","EUR - Euro","FKP - Falkland Islands Pound","FJD - Fijian Dollar","GMD - Gambian Dalasi","GEL - Georgian Lari","GHS - Ghanaian Cedi","GIP - Gibraltar Pound","GTQ - Guatemalan Quetzal","GNF - Guinean Franc","GYD - Guyanese Dollar","HTG - Haitian Gourde","HNL - Honduran Lempira","HKD - Hong Kong Dollar","HUF - Hungarian Forint","ISK - Icelandic Kruna","INR - Indian Rupee","IDR - Indonesian Rupiah","IRR - Iranian Rial","IQD - Iraqi Dinar","ILS - Israeli New Sheqel","JMD - Jamaican Dollar","JPY - Japanese Yen","JOD - Jordanian Dinar","KZT - Kazakhstani Tenge","KES - Kenyan Shilling","KWD - Kuwaiti Dinar","KGS - Kyrgyzstani Som","LAK - Lao Kip","LVL - Latvian Lats","LBP - Lebanese Lira","LSL - Lesotho Loti","LRD - Liberian Dollar","LYD - Libyan Dinar","MOP - Macanese Pataca","MKD - Macedonian Denar","MGA - Malagasy Ariary","MWK - Malawian Kwacha","MYR - Malaysian Ringgit","MVR - Maldivian Rufiyaa","MRO - Mauritanian Ouguiya","MUR - Mauritian Rupee","MXN - Mexican Peso","MDL - Moldovan Leu","MNT - Mongolian Tugrik","MAD - Moroccan Dirham","MZN - Mozambican Metical","MMK - Myanma Kyat","NAD - Namibian Dollar","NPR - Nepalese Rupee","ANG - Netherlands Antillean Gulden","TWD - New Taiwan Dollar","NZD - New Zealand Dollar","NIO - Nicaraguan Cordoba","NGN - Nigerian Naira","KPW - North Korean Won","NOK - Norwegian Krone","OMR - Omani Rial","TOP - Paanga","PKR - Pakistani Rupee","PAB - Panamanian Balboa","PGK - Papua New Guinean Kina","PYG - Paraguayan Guarani","PEN - Peruvian Nuevo Sol","PHP - Philippine Peso","PLN - Polish Zloty","QAR - Qatari Riyal","RON - Romanian Leu","RUB - Russian Ruble","RWF - Rwandan Franc","SHP - Saint Helena Pound","WST - Samoan Tala","STD - Sao Tome And Principe Dobra","SAR - Saudi Riyal","RSD - Serbian Dinar","SCR - Seychellois Rupee","SLL - Sierra Leonean Leone","SGD - Singapore Dollar","SBD - Solomon Islands Dollar","SOS - Somali Shilling","ZAR - South African Rand","KRW - South Korean Won","XDR - Special Drawing Rights","LKR - Sri Lankan Rupee","SDG - Sudanese Pound","SRD - Surinamese Dollar","SZL - Swazi Lilangeni","SEK - Swedish Krona","CHF - Swiss Franc","SYP - Syrian Pound","TJS - Tajikistani Somoni","TZS - Tanzanian Shilling","THB - Thai Baht","TTD - Trinidad and Tobago Dollar","TND - Tunisian Dinar","TRY - Turkish New Lira","TMT - Turkmenistan Manat","AED - UAE Dirham","UGX - Ugandan Shilling","UAH - Ukrainian Hryvnia","USD - United States Dollar","UYU - Uruguayan Peso","UZS - Uzbekistani Som","VUV - Vanuatu Vatu","VEF - Venezuelan Bolivar","VND - Vietnamese Dong","XOF - West African CFA Franc","YER - Yemeni Rial","ZMW - Zambian Kwacha"]
var converstionRate:Double?
override func viewDidLoad() {
super.viewDidLoad()
self.currencyChoiceOne.text = self.currencyList[1]
self.currencyChoiceTwo.text = self.currencyList[1]
self.spinnerOne.isHidden = true
self.spinnerTwo.isHidden = true
// Do any additional setup after loading the view, typically from a nib.
}
@@ -19,7 +45,88 @@ class ViewController: UIViewController {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func textFieldChangeListener(_ sender: Any) {
let valueOne = Double(inputOne.text!)
let valueTwo = (valueOne ?? 1)*exchangeRate
self.inputTwo.text = String(describing: valueTwo)
}
@IBAction func textChangeListenerTwo(_ sender: Any) {
let valueOne = Double(inputTwo.text!)
let valueTwo = (valueOne ?? 1)*exchangeRate
self.inputOne.text = String(valueTwo)
}
public func numberOfComponents(in pickerView: UIPickerView) -> Int{
return 1
}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return currencyList.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
self.view.endEditing(true)
return currencyList[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if (pickerView.tag == 1){
self.currencyChoiceOne.text = self.currencyList[row]
downloadData()
self.spinnerOne.isHidden = true
}else if(pickerView.tag == 2){
self.currencyChoiceTwo.text = self.currencyList[row]
downloadData()
self.spinnerTwo.isHidden = true
}
}
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == self.currencyChoiceOne {
self.spinnerOne.isHidden = false
//if you dont want the users to se the keyboard type:
textField.endEditing(true)
}else if textField == self.currencyChoiceTwo{
self.spinnerTwo.isHidden = false
textField.endEditing(true)
}
}
func downloadData() {
Alamofire.request(urlBuilder()).responseJSON { response in
if let json = response.result.value as? Dictionary<String,Double> {
self.exchangeRate = json["\(self.rateOne)_\(self.rateTwo)"]!
}
}
}
func urlBuilder() -> String{
var url = "https://free.currencyconverterapi.com/api/v6/convert?q="
rateOne = String(currencyChoiceOne.text!.characters.prefix(3))
rateTwo = String(currencyChoiceTwo.text!.characters.prefix(3))
url = url + rateOne + "_" + rateTwo + "&compact=ultra"
print(url)
return url
}
}