본문 바로가기

iOS 프로그래밍

iOS 프로그래밍_10주차

이슈네비게이터가 발생하는 이유는 해상도가 달라서이다. 오토레이아웃으로 해결한다.

더보기

* 이슈 네비게이터(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