Skip to content

240102 Day6 #2

@HeegeePark

Description

@HeegeePark

240102 Day6

앱 생명주기

Not Running

앱 시작되기 전 상태

Active(Foreground)

앱이 화면에서 실행중인 상태

Inactive(Foreground)

앱이 화면에서 실행중이나 어떤 신호도 받지 않는 상태(전화가 오거나, 알람)

Background

앱이 화면에 보이지 않지만 코드를 실행하고 있는 상태

Suspended

앱이 곧 종료될 상태

AppDelegate

앱 생명주기를 관리함.

iOS 13 이후부터는 UI를 담당하지 않고 앱만 담당.

옛날에 면접 질문으로 AppDelegate 많이 물어본 이유?

  • iOS 12까지는 AppDelegate만 있었음.

SceneDelegate

탄생 배경

  • iOS 13에 iPadOS가 등장하게 되면서 함께 등장
    • 한 화면에 여러 앱을 띄울 수 있고, 같은 앱도 여러 개 띄울 수 있게 되면서 생명주기가 복잡해짐
    • 그래서 SceneDelegate 등장.

iOS 13 미만도 지원해야할 때

@available 키워드 사용해서 UIScene관련 코드에 붙이기

@available, #available, @unavailable 관련해서 알아보기

  • appdelegate scene 관련 함수
  • scenedelegate 클래스
image

그래도 13 이상이 지원되는거지, 13 미만은 저 코드가 실행이 안됨.

→ appDelegate에 UIWindow를 만들어주면 된다.

image

UIWindow

아이폰은 UIWindow 하나를 띄워놓고,

UIWindow 위에 뷰컨트롤러가 올라간다.

즉, 실질적으로 화면을 보여주는 역할

실습

UIDatePicker

버전별로 조금 다름

image

액션함수 value Changed 액션으로

  • 휠 방식은 휠을 움직이다 멈췄을 때 액션 감지됨.

출력되는 현재 시간은 영국 표준시.

→ 어떻게 고칠까? 아래를 보셈.

DateFormatter

올바른 시간과 편한 포맷으로 시간을 출력하기 위해서는 DateFormatter가 필요!

알아서 시간도 시차에 맞게 변경해줌.

let format = DateFormatter()
format.dateFormat = "yyyy년 MM월 dd일 hh시 mm분" // "2024년 01월 01일 12시 30분"
//format.dateFormat = "yyyy년 M월 d일" // "2024년 1월 1일"

let result = format.string(from: datePicker.date)

연도는 YYYY보다 yyyy를 쓰자

YYYY를 쓰면 해외의 주번호(?) 때문에 연말에 연도이상해짐.

UIView tag

각각의 기능을 분류할 수 있음.

image

label에 여러 줄의 문자열이 안먹힐때

label numberofline 설정안해주면 안먹힘(기본값이 1이기 때문)

몇줄이라도 다 보여주고 싶다면 0으로 설정.

label.numberOfLines = 0

액션함수 기능이 안눌러도 화면 뜨자마자 실행하고플 때

액션함수를 viewDidLoad()에 명령하면 됨

override func viewDidLoad() {
        super.viewDidLoad()
        
        datePickerValueChanged(datePicker)
    }

return이 있는 함수를 경고 안띄우고 싶을 때

반환값을 사용안해서 노란 경고 뜸

image

@discardableResult 사용하면 해결완료!

image

implicit return

swift 5.1+

함수 내 코드가 한 줄이면 return 생략가능

func getRandomNumber() -> Int {
    Int.random(in: 1...100)
}

UIAlertController

UIViewController를 상속받았음. → present()로 띄움.

// 1. 컨텐츠
        let alert = UIAlertController(title: "기념일 저장", message: "이 날짜를 저장하시겠습니까?", preferredStyle: .alert)
        
        // 2. 버튼
        let button1 = UIAlertAction(title: "버튼1", style: .cancel)
        let button2 = UIAlertAction(title: "버튼2", style: .destructive)
        let button3 = UIAlertAction(title: "버튼3", style: .default)
        let button4 = UIAlertAction(title: "버튼4", style: .default)
        
        // 3. 컨텐츠 + 버튼
        alert.addAction(button1)
        alert.addAction(button2)
        alert.addAction(button3)
        alert.addAction(button4)
        
        // 4. 띄우기
        present(alert, animated: true)

버튼 순서는 add한 순서대로
하지만, .cancel 스타일은 항상 자동으로 가장 왼쪽 도는 맨 아래에 붙음.

  • .cancel 스타일은 하나만 가능!
    액션버튼이 2개 이하면 가로로 뜬다.
image

.alert

  • 사용자가 꼭 선택해야 할 때나 중요한 경우일 때 쓰임

.actionSheet

  • 화면 하단에 쓰윽 보여주고 싶을 때
  • title과 message를 잘 안씀.(nil로 설정할 것.)

StackView

균일한 간격을 표현할 때 주로 사용.

Spacing: stack view 안의 뷰 간 간격

Alignment: 서로 다른 크기를 가진 뷰들의 정렬 기준

  • Horizontal
    • Fill: 높이 사이즈 만큼 뷰 가득 채움
    • Top: 위쪽으로 정렬
    • Center: 가운데 정렬
    • Bottom: 밑쪽으로 정렬
  • Vertical
    • Fill: 넓이 사이즈 만큼 뷰 가득 채움
    • Leading: 왼쪽으로 정렬
    • Center: 가운데 정렬
    • Trailing: 오른쪽 정렬

distribution: stack view 안의 뷰들의 관계(분배 방법)

  • Fill Equally: 모든 뷰들의 길이 동등하게
  • Equal Spacing: 뷰 들의 간격을 동일하게(spacing 설정값 상관없이 동일한 spacing으로 재조정)
  • Equal Centering: 뷰 들의 가운데를 기준으로 간격 동일하게
  • Fill Proportionally: 뷰 안의 컨텐츠 크기에 비례하여 뷰 속 여백 설정(spacing은 설정한 값으로)

StackView 참조

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions