이슈네비게이터가 발생하는 이유는 해상도가 달라서이다. 오토레이아웃으로 해결한다.
* 이슈 네비게이터(Issue Navigator)는 Xcode에서 프로젝트의 오류, 경고, 또는 기타 문제를 쉽게 관리할 수 있도록 도와주는 도구입니다.
이 네비게이터가 뜨는 이유 :
컴파일 오류: 코드에 문법 오류나 타입 오류가 있을 때, 이슈 네비게이터에 해당 오류가 표시됩니다.
경고: 코드에서 잠재적인 문제나 비효율적인 부분이 발견되면 경고가 나타나며, 이 역시 이슈 네비게이터에서 확인할 수 있습니다.
테스트 실패: 유닛 테스트나 UI 테스트가 실패할 경우, 해당 테스트와 관련된 이슈가 나타납니다.
리소스 관련 문제: 이미지, 파일, 또는 다른 리소스가 누락되거나 잘못된 경로에 있을 때도 이슈로 표시됩니다.
* 오토 레이아웃(Autolayout)은 iOS에서 사용자 인터페이스(UI)를 구성할 때 사용하는 레이아웃 시스템입니다. 이를 통해 다양한 화면 크기와 방향에 맞춰 UI 요소의 위치와 크기를 동적으로 조정할 수 있습니다.
주요 특징 :
1. 제약 조건 : UI 요소 간의 관계를 정의하는 제약 조건(Constraints)을 설정하여 요소들이 서로 어떻게 배치될지를 결정합니다.
2. 반응형 디자인 : 다양한 기기와 화면 크기에 맞춰 자동으로 UI를 조정할 수 있어, iPhone, iPad 등에서 일관된 사용자 경험을 제공합니다.
3. 변화 감지 : 화면 회전, 크기 조정 등의 이벤트에 따라 UI 요소들이 자동으로 재배치됩니다.
오토 레이아웃을 사용하면 복잡한 레이아웃을 쉽게 관리할 수 있으며, 코드로도 제약 조건을 설정할 수 있지만, 주로 스토리보드나 Xcode의 인터페이스 빌더를 통해 시각적으로 설정하는 것이 일반적입니다.
입력받기 위해 연결하기
view controller로 outlet 확인
//
// ViewController.swift
// BMI_kej
//
// Created by 소프트웨어컴퓨터 on 2024/11/13.
//
import UIKit
import Foundation
class ViewController: UIViewController {
@IBOutlet weak var txtHeight: UITextField!
@IBOutlet weak var txtWeight: UITextField!
@IBOutlet weak var lblResult: UILabel!
@IBAction func calcBmi(_ sender: UIButton) {
let weight = Double(txtWeight.text!)!
let height = Double(txtHeight.text!)!
let bmi = weight / (height*height*0.0001) // kg/m*m
let shortenedBmi = String(format: "%.1f", bmi)
var body = ""
if bmi >= 40 {
body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
body = "정상"
} else {
body = "저체중"
}
print("BMI:\(shortenedBmi), 판정:\(body)")
lblResult.text = "BMI:\(shortenedBmi), 판정:\(body)"
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
→ 이 소스는 둘 중에 하나의 값이라도 넣지 않으면 에러가 난다.
Swift에서 느낌표(!)는 강제 언래핑(Force Unwrapping)을 의미합니다. 코드에서 사용하는 두 개의 느낌표는 다음과 같은 역할을 합니다:
첫 번째 느낌표: txtHeight.text!에서 사용된 첫 번째 느낌표는 txtHeight.text가 옵셔널 타입(Optional)임을 나타내며, 이 값을 강제로 언래핑하여 실제 문자열 값으로 변환합니다. 즉, txtHeight.text가 nil이 아닐 때만 안전하게 사용할 수 있습니다. 만약 nil이라면 런타임 오류가 발생합니다.
두 번째 느낌표: Double(txtHeight.text!)!에서 사용된 두 번째 느낌표는 Double 초기화가 반환하는 값이 옵셔널 타입이라는 것을 의미합니다. Double(txtHeight.text!)는 문자열을 Double로 변환하려 시도하며, 변환이 성공하면 Double 값을 반환하고 실패하면 nil을 반환합니다. 두 번째 느낌표는 이 옵셔널 값을 강제로 언래핑하여 실제 Double 값으로 사용하겠다는 의미입니다.
이렇게 두 개의 느낌표를 사용하면, 코드가 실행될 때 txtHeight.text가 nil이거나 변환이 실패하는 경우에 오류가 발생할 수 있으므로, 안전하게 사용하려면 옵셔널 바인딩을 사용하는 것이 좋습니다.
소스 정렬 control + i
lblResult.clipsToBounds = true
lblResult.layer.cornerRadius = 10
import UIKit // UIKit 프레임워크를 가져와 UI 요소들 사용
import Foundation // 기본 데이터 타입 및 기능을 위한 Foundation 프레임워크
class ViewController: UIViewController { // ViewController 클래스 선언
@IBOutlet weak var txtHeight: UITextField! // 키 입력 필드와 연결된 IBOutlet
@IBOutlet weak var txtWeight: UITextField! // 체중 입력 필드와 연결된 IBOutlet
@IBOutlet weak var lblResult: UILabel! // 결과 레이블과 연결된 IBOutlet
@IBAction func calcBmi(_ sender: UIButton) { // BMI 계산을 위한 액션 메서드
// 입력값이 비어있는지 확인
if txtHeight.text == "" || txtWeight.text == "" {
lblResult.textColor = .red // 텍스트 색상을 빨간색으로 설정
lblResult.text = "키와 체중을 입력하세요!" // 오류 메시지 출력
return // 메서드 종료
} else {
// 입력된 텍스트를 Double로 변환
let weight = Double(txtWeight.text!)! // 체중을 Double로 변환
let height = Double(txtHeight.text!)! // 키를 Double로 변환
// BMI 계산: 체중(kg) / (신장(m) * 신장(m))
let bmi = weight / (height * height * 0.0001) // cm를 m로 변환하기 위해 0.0001로 나누기
let shortenedBmi = String(format: "%.1f", bmi) // 소수점 한 자리까지 포맷팅
var body = "" // BMI 판정을 저장할 변수
var color = UIColor.white // 초기 배경색 설정
// BMI 값에 따라 판정 및 배경색 결정
if bmi >= 40 {
color = UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) // 3단계 비만: 빨간색
body = "3단계 비만" // 판정 메시지
} else if bmi >= 30 && bmi < 40 {
color = UIColor(displayP3Red: 0.7, green: 0.0, blue: 0.0, alpha: 1.0) // 2단계 비만: 어두운 빨간색
body = "2단계 비만" // 판정 메시지
} else if bmi >= 25 && bmi < 30 {
color = UIColor(displayP3Red: 0.4, green: 0.0, blue: 0.0, alpha: 1.0) // 1단계 비만: 더 어두운 빨간색
body = "1단계 비만" // 판정 메시지
} else if bmi >= 18.5 && bmi < 25 {
color = UIColor(displayP3Red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) // 정상: 파란색
body = "정상" // 판정 메시지
} else {
color = UIColor(displayP3Red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0) // 저체중: 초록색
body = "저체중" // 판정 메시지
}
// 레이블의 배경색 설정
lblResult.backgroundColor = color
// lblResult.textColor = .white // 텍스트 색상을 흰색으로 설정할 수 있음 (주석 처리됨)
lblResult.clipsToBounds = true // 레이블의 경계 내에서 자르기 설정
lblResult.layer.cornerRadius = 10 // 레이블의 모서리를 둥글게 설정
lblResult.text = "BMI:\(shortenedBmi), 판정:\(body)" // 최종 결과 출력
}
}
override func viewDidLoad() {
super.viewDidLoad() // 부모 클래스의 viewDidLoad 호출
// Do any additional setup after loading the view. // 추가 설정을 여기에 작성할 수 있음
}
}
Tab bar controller
새로 만든 View Controller를 Tab Bar Controller와 연결
'iOS 프로그래밍' 카테고리의 다른 글
iOS 프로그래밍_13주차 (0) | 2024.12.11 |
---|---|
iOS 프로그래밍_11주차 (0) | 2024.11.27 |
iOS 프로그래밍_9주차 (0) | 2024.11.13 |
iOS 프로그래밍_8주차 (0) | 2024.11.06 |
iOS 프로그래밍_7주차 (0) | 2024.10.30 |