레이블 연결
1. @IBOutlet
으로 아래의 Label
들을 연결해준다.
2. @IBAction
도 연결해준다.
ResultsVC에 IBAction 및 IBOutlet 생성
1. Cocoa Touch
파일 생성 > ResultsViewController
라고 부르고 UIViewController
의 서브클래스로 지정.
2. Main.storyboard
의 ResultsViewController
를 연결시킴
3. ResultsVC
에 IBOutlet
및 IBAction
을 연결
버튼 toggle 활성화
isSelected
라는 속성을 사용하여 버튼에 배경이 있고 선택된 것처럼 보이게 할 수 있다.
@IBAction func tipChanged(_ sender: UIButton) {
//버튼을 false 상태로 지정
zeroPctBtn.isSelected = false
tenPctBtn.isSelected = false
twentyPctBtn.isSelected = false
// 선택된 sender만 true로 바뀜
sender.isSelected = true
}
백분율 소수로 변경
20% 버튼을 탭하면 20% 가 출력되고, 계산 버튼을 탭 하면 콘솔에 0.2가 출력될 수 있게 해 준다.
var tip = 0.1
@IBAction func tipChanged(_ sender: UIButton) {
let buttonTitle = sender.currentTitle!
// 🔥 buttonTitle의 문자에서 제일 마지막 문자를 삭제한다. ( dropLast(n) 메서드 )
let removeSymbolFromTitle = String(buttonTitle.dropLast())
// 문자열을 Double로 변경
let buttonTitleAsANumber = Double(removeSymbolFromTitle)!
// buttonTitleAsANumber 을 100으로 나눠 소수점으로 표시되게 함
tip = buttonTitleAsANumber / 100
}
dropLast(n:)
메서드를 사용하면 문자의 마지막 부분을 탈락시키는 효과를 사용할 수 있다.
Stepper
Stepper
의 + 또는 - 를 클릭하면 splitNumberLabel
가 업데이트되도록 해준다.
@IBOutlet weak var splitNumLabel: UILabel!
@IBAction func stepperValueChanged(_ sender: UIStepper) {
splitNumLabel.text = String(format: "%.0f", sender.value)
persentageValue = Int(sender.value)
}
TextField
1. textField
에 입력한 값을 출력하고 이것을 정수로 바꿔줌.
2. keyboard
를 numberpad
스타일로 지정함. keyboardType = .numberPad
메서드
3. percent
를 클릭했을 때 키보드가 닫힐 수 있게 구현한다. endEditing(true)
메서드
@IBOutlet weak var billTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
billTextField.keyboardType = .numberPad
}
@IBAction func tipChanged(_ sender: UIButton) {
//textField
billTextField.endEditing(true)
}
@IBAction func calculatePressed(_ sender: UIButton) {
let bill = billTextField.text!
// bill이 empty가 아니라면 실행
if bill != "" {
//String타입의 bill을 Double타입으로 변경
billTotal = Double(bill)!
// 총 값에 터치페이 하기 때문에 1을 더한 팁을 곱한 후 인원수로 나눈다.
let result = billTotal * (1 + tip) / Double(persentageValue)
let resultTo2DecimalPalces = String(format: "%.2f", result)
totalValue = resultTo2DecimalPalces
print(resultTo2DecimalPalces)
}
performSegue(withIdentifier: "goToResult", sender: nil)
}
결과를 ResultVC로 전달 - Segue
1. CalculatorVC
와 ResultsVC
사이에 "Present Modally" segue
로 이어준다.
2. 계산 버튼을 누르면 segue
가 트리거 되고 화면이 ResultsViewController
로 전환된다.
3. ResultsViewController
에서 다시 계산 버튼을 누르면 이전 CalculateViewController
로 dismiss
된다.
// CalculateViewController.swift
import UIKit
class CalculatorViewController: UIViewController {
@IBOutlet weak var billTextField: UITextField!
@IBOutlet weak var zeroPctBtn: UIButton!
@IBOutlet weak var tenPctBtn: UIButton!
@IBOutlet weak var twentyPctBtn: UIButton!
@IBOutlet weak var splitNumLabel: UILabel!
var tip = 0.1
var persentageValue = 2
var billTotal = 0.0
var totalValue: String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
billTextField.keyboardType = .numberPad
billTextField.endEditing(true)
}
@IBAction func tipChanged(_ sender: UIButton) {
//textField
billTextField.endEditing(true)
//버튼을 false 상태로 지정
zeroPctBtn.isSelected = false
tenPctBtn.isSelected = false
twentyPctBtn.isSelected = false
// 선택된 sender만 true로 바뀜
sender.isSelected = true
let buttonTitle = sender.currentTitle!
// 🔥 buttonTitle의 문자에서 제일 마지막 문자를 삭제한다. ( dropLast(n) 메서드 )
let removeSymbolFromTitle = String(buttonTitle.dropLast())
// 문자열을 Double로 변경
let buttonTitleAsANumber = Double(removeSymbolFromTitle)!
// buttonTitleAsANumber 을 100으로 나눠 소수점으로 표시되게 함
tip = buttonTitleAsANumber / 100
}
@IBAction func stepperValueChanged(_ sender: UIStepper) {
splitNumLabel.text = String(format: "%.0f", sender.value)
persentageValue = Int(sender.value)
}
@IBAction func calculatePressed(_ sender: UIButton) {
let bill = billTextField.text!
if bill != "" {
billTotal = Double(bill)!
// 총 값에 터치페이 하기 때문에 1을 더한 팁을 곱한 후 인원수로 나눈다.
let result = billTotal * (1 + tip) / Double(persentageValue)
let resultTo2DecimalPalces = String(format: "%.2f", result)
totalValue = resultTo2DecimalPalces
print(resultTo2DecimalPalces)
}
performSegue(withIdentifier: "goToResult", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToResult" {
let destination = segue.destination as! ResultViewController
destination.totalValue = totalValue
destination.tip = Int(tip * 100)
destination.split = persentageValue
}
}
}
// ResultViewController.swift
import UIKit
class ResultViewController: UIViewController {
@IBOutlet weak var totalLabel: UILabel!
@IBOutlet weak var settingLabel: UILabel!
var totalValue: String?
var tip = 0
var split = 0
override func viewDidLoad() {
super.viewDidLoad()
totalLabel.text = totalValue
settingLabel.text = "\(tip)%의 팁으로 \(split)명의 사람들과 더치페이 합니다."
}
@IBAction func reCalcultatePressed(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
}
완성 파일
'SWIFT > Udemy iOS' 카테고리의 다른 글
[Udemy] 섹션13 : Protocols, Networking, Delegate 패턴, JSON Parsing, UITextField 날씨 앱 (0) | 2021.09.12 |
---|---|
[Udemy] 섹션11: Segue, Cocoa Touch Class, Optional Binding, BMI계산기 (0) | 2021.08.09 |
[Udemy] 섹션 10: iOS App Design Pattern Challenge (0) | 2021.08.05 |
[Udemy] 섹션9: MVC 패턴, Struct, mutating ( 퀴즈 앱 ) (0) | 2021.08.02 |
[Udemy] 섹션8: Egg Timer / ProgressView ( Control Flow and Optionals ) (0) | 2021.07.31 |