Do you want to learn how to make iPhone Apps? Do you want everything in one video instead of 40? Do you prefer videos that are 1 hour long instead of 4 or 5? Then you found the right tutorial! In this one 1 Hour Video I’ll show you how to make a complete app. You’ll learn so much that you’ll be able to take this knowledge and make a countless number of completely different apps.
I have the whole project on GitHub for you to download. All of the code is below and heavily commented.
Check out my #1 ranked Python tutorial on Udemy on sale until Feb 19th for $10. It currently has over 19 hours of content, 86 videos and I add new videos every week!
Code from the Video
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
import UIKit // Implement UITextFieldDelegate to block users from // entering anything that isn't a float in total bill class ViewController: UIViewController, UITextFieldDelegate { // References to all components I want to either // receive values from our change values @IBOutlet weak var totalBillTextField: UITextField! @IBOutlet weak var tipTextField: UITextField! @IBOutlet weak var totalTextField: UITextField! @IBOutlet weak var tipPercentLabel: UILabel! @IBOutlet weak var splitLabel: UILabel! @IBOutlet weak var tipSplitTextField: UITextField! @IBOutlet weak var totalSplitTextField: UITextField! // Returns a Double version of the string value // assigned to totalBillTextField var totalBill: Double? { return Double(totalBillTextField.text!) } // Stores the changing tip percentage var tipPercentage: Double = 0.15 // Stores the changing number of people paying var numberOfPeople: Double = 1.0 // Used to define we will only allow conforming // decimal numbers to be allowed for user input private var formatter: NumberFormatter! // Called when the app loads override func viewDidLoad() { super.viewDidLoad() // Define if a tap gesture occurs on the main // view that the keyboard should be closed let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:))) self.view.addGestureRecognizer(tapGesture) // Assign the textfields delegate to the view // controller class totalBillTextField.delegate = self // Initialize the formatter and define the number // must conform to the decimal format and have a // minimum value of zero formatter = NumberFormatter() formatter.numberStyle = NumberFormatter.Style.decimal formatter.minimum = 0 } @IBAction func tipSliderChanged(_ sender: UISlider) { // Get slider value let sliderValue = Int(sender.value) // Assign slider value to the label with a % tipPercentLabel.text = "\(sliderValue)%" // Change value for tip percentage tipPercentage = Double(Int(sender.value)) * 0.01 updateInterface() } @IBAction func splitStepperChanged(_ sender: UIStepper) { // Get stepper value let stepperValue = Int(sender.value) // Assign stepper value to the label splitLabel.text = "\(stepperValue)" numberOfPeople = Double(stepperValue) updateInterface() } // Called when the total bill textfield loses focus @IBAction func totalBillTextFieldChanged(_ sender: UITextField) { updateInterface() } // When resignFirstResponder is called on the // textfield it closes the keyboard @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) { totalBillTextField.resignFirstResponder() } func updateInterface(){ // Get value in Total Bill and calculate tip amount if let totalBill = self.totalBill { tipTextField.text = String(format: "$%.2f", (totalBill * tipPercentage)) totalTextField.text = String(format: "$%.2f", (totalBill * tipPercentage) + totalBill) tipSplitTextField.text = String(format: "$%.2f", (totalBill * tipPercentage) / numberOfPeople) totalSplitTextField.text = String(format: "$%.2f", ((totalBill * tipPercentage) + totalBill) / numberOfPeople) } } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // If the textfield value conforms to the formatter's // settings then it is valid and if not then nil is // returned and the value isn't allowed return formatter.number(from: "\(textField.text ?? "0.00")\(string)") != nil } } |
Leave a Reply