250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- jQuery
- 개발자
- HTML
- SWIFT
- Animation
- MAC
- javascript
- 풀스택
- 애니메이션
- html5
- php
- 비전공자
- hover
- xcode
- ipad
- iPhone
- 자바스크립트
- button
- 백엔드
- css3
- CSS
- effect
- image
- keyframes
- 프론트엔드
- 비전공 개발자
- IOS
- front-end
- react
- iOS 개발자
Archives
- Today
- Total
비전공자 개발일기
BMI Calculator 본문
728x90
SMALL
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var mainLabel: UILabel!
@IBOutlet weak var calculateButton: UIButton!
@IBOutlet weak var heightTextField: UITextField!
@IBOutlet weak var weightTextField: UITextField!
// BMI계산 결과값 보관위한 변수
var bmi: Double?
override func viewDidLoad() {
super.viewDidLoad()
heightTextField.delegate = self
weightTextField.delegate = self
configureUI()
}
func configureUI() {
mainLabel.text = "키와 몸무게를 입력해 주세요"
calculateButton.layer.cornerRadius = 5
heightTextField.placeholder = "cm단위로 입력해주세요"
weightTextField.placeholder = "kg단위로 입력해주세요"
}
// BMI계산하기 - 버튼 누르면(다음화면)
@IBAction func calculateButtonTapped(_ sender: UIButton) {
print(#function)
bmi = calculateBMI(height: heightTextField.text!, weight: weightTextField.text!)
// 필요없음(버튼에서 직접 연결)
//performSegue(withIdentifier: "toSecondVC", sender: self)
}
// 조건에 따라 다음화면 이동할지/말지
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
print(#function)
if heightTextField.text == "" || weightTextField.text == "" {
mainLabel.text = "키와 몸무게를 입력하셔야만 합니다!!!"
mainLabel.textColor = UIColor.red
return false
}
mainLabel.text = "키와 몸무게를 입력해 주세요"
mainLabel.textColor = UIColor.black
return true
}
// 다음화면 넘어가기 전에 준비 (일반적으로 데이터 전달)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print(#function)
// 항상 식별자 먼저 확인
if segue.identifier == "toSecondVC" {
let secondVC = segue.destination as! SecondViewController
secondVC.modalPresentationStyle = .fullScreen
// 다음화면으로 데이터 전달
secondVC.bmiNumber = bmi
secondVC.bmiColor = getBackgroundColor()
secondVC.adviceString = getBMIAdviceString()
}
// 다음화면으로 가기전에 텍스트필드 비우기
heightTextField.text = ""
weightTextField.text = ""
}
// BMI계산 메서드
func calculateBMI(height: String, weight: String) -> Double {
guard let h = Double(height), let w = Double(weight) else { return 0.0 }
var bmi = w / (h * h) * 10000
bmi = round(bmi * 10) / 10
print("BMI결과값: \(bmi)")
return bmi
}
// 색깔 얻는 메서드
func getBackgroundColor() -> UIColor {
guard let bmi = bmi else { return UIColor.black }
switch bmi {
case ..<18.6:
return UIColor(displayP3Red: 22/255, green: 231/255, blue: 207/255, alpha: 1)
case 18.6..<23.0:
return UIColor(displayP3Red: 212/255, green: 251/255, blue: 121/255, alpha: 1)
case 23.0..<25.0:
return UIColor(displayP3Red: 218/255, green: 127/255, blue: 163/255, alpha: 1)
case 25.0..<30.0:
return UIColor(displayP3Red: 255/255, green: 150/255, blue: 141/255, alpha: 1)
case 30.0...:
return UIColor(displayP3Red: 255/255, green: 100/255, blue: 78/255, alpha: 1)
default:
return UIColor.black
}
}
// 문자열 얻는 메서드
func getBMIAdviceString() -> String {
guard let bmi = bmi else { return "" }
switch bmi {
case ..<18.6:
return "저체중"
case 18.6..<23.0:
return "표준"
case 23.0..<25.0:
return "과체중"
case 25.0..<30.0:
return "중도비만"
case 30.0...:
return "고도비만"
default:
return ""
}
}
}
extension ViewController: UITextFieldDelegate {
// 입력하거나 (지우거나) 할때마다 (한글자 한글자 입력하는 순간마다) 호출되는 메서드
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print(string)
// "숫자"인 경우와 "지우는 경우"만 (글자입력을) 허용 하는 논리
// (숫자로 변환이 된다면) || (지울때)
if Int(string) != nil || string == "" {
return true // 글자 입력을 허용
}
return false // 글자입력 허용하지 않음
}
// 키보드 엔터키가 눌렸을때 (다음 동작을 허락할 것인지)
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// 두개의 텍스트필드를 모두 종료 (키보드 내려가기)
if heightTextField.text != "", weightTextField.text != "" {
weightTextField.resignFirstResponder()
return true
// 두번째 텍스트필드로 넘어가도록
} else if heightTextField.text != "" {
weightTextField.becomeFirstResponder()
return true
}
return false
}
// 텍스트필드 이외의 영역을 눌렀을때 키보드 내려가도록
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
heightTextField.resignFirstResponder()
weightTextField.resignFirstResponder()
}
}
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var bmiNumberLabel: UILabel!
@IBOutlet weak var adviceLabel: UILabel!
@IBOutlet weak var backButton: UIButton!
// 전화면에서 전달받은 데이터들
var bmiNumber: Double?
var adviceString: String?
var bmiColor: UIColor?
override func viewDidLoad() {
super.viewDidLoad()
// 전화면에서 전달받은 데이터들을 통해 셋팅
bmiNumberLabel.text = "\(bmiNumber!)"
bmiNumberLabel.backgroundColor = bmiColor
adviceLabel.text = adviceString
configureUI()
}
// UI셋팅
func configureUI() {
bmiNumberLabel.clipsToBounds = true
bmiNumberLabel.layer.cornerRadius = 8
//bmiNumberLabel.backgroundColor = UIColor.brown
backButton.layer.cornerRadius = 5
}
// 다시 계산하기 버튼 눌렀을때
@IBAction func backButtonTapped(_ sender: UIButton) {
// 전화면으로 돌아가는 메서드
self.dismiss(animated: true, completion: nil)
}
}
번외: Xcode 프로젝트 이름 변경
https://zeddios.tistory.com/286
728x90
LIST
'SWIFT' 카테고리의 다른 글
Quote Generator (0) | 2022.12.12 |
---|---|
Swift Study - Function, Class, Struct, Closure (0) | 2022.12.10 |
Login View (0) | 2022.12.07 |
Text Field & Delegate (0) | 2022.12.06 |
Timer App (0) | 2022.12.05 |