[SwiftUI] Scene

RudinP·3일 전
0

Study

목록 보기
282/292
@main
struct HelloSwiftUIAppApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: HelloSwiftUIAppDocument()) { file in
            ContentView(document: file.$document)
        }
    }
}
  • body속성에서 리턴하는 객체는 반드시 Scene 프로토콜을 구현해야 한다.
  • 여기서는 DocumentGroupScene이다.
  • 문서기반 앱을 사용할때는 DocumentGroup 을 사용하며, 기본적으로는 WindowGroup을 기본 앱을 만들 때 사용한다.
    • ios, watchOS : Window를 화면 전체에 표시
    • ipadOS, macOS: Window를 여러개의 윈도우를 한 번에 표시 가능

WindowGroup과 DocumentGroup의 차이


Scene에서의 작업

코드의 가독성을 위해 별도의 커스텀 Scene 구현

@main
struct HelloSwiftUIAppApp: App {
    var body: some Scene {
        MyScene()
    }
}

struct MyScene: Scene {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Scene의 상태에 따라 원하는 작업을 실행

struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
  • ScenePhase라는 시스템 공유 객체를 통해 확인 가능
  • Scene의 상태가 바뀔때마다 속성에 저장되는데 active, inactive, background 중에 하나가 저장된다.
    • active: 화면에 표시된 상태에서 터치이벤트와 같은 이벤트 처리 가능
    • inactive: 화면에 표시되어있지만 이벤트 처리 불가
    • background: 화면 표시 X 백그라운드 상태

상태가 바뀔때마다 어떤 코드를 실행하고싶다면?

struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { oldPhase, newPhase in
            if newPhase == . background {
                //ex) background로 넘어갈때 캐시 비우는 작업
                //ex) active상태가 되었을때 데이터 다시 읽어오는 작업
            }
        }
    }
}
  • 윈도우그룹 위에 onChange 모디파이어 사용
  • scene은 OS에 따라 여러 인스턴스를 만들 수 있기 때문에 상태를 확인할 때 주의해야 한다.
    • scene이 2개 이상이면 리턴값이 달라진다.
    • 앱에 포함된 scene중에 하나라도 active라면 active를 리턴.
    • 만약 a씬이 inactive라 하더라도 b씬이 active라면 active가 리턴된다.
    • 모든 씬이 inactive여야지만 inactive 리턴
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글