Hacking with Swift 사이트의 강좌 번역본입니다.
[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-make-a-view-dismiss-itself]
How to make a view dismiss itself
시트(sheet)를 사용해서 SwiftUI 뷰을 보여줄때, 일반적으로 어떤 일이 발생했을때 뷰를 닫기 원합니다 - 예를들어, 사용자가 버튼을 탭할때 입니다. Swift에는 해결하는 2가지 방법이 있고, 둘 다 보여줄 것이므로 필요에 따라 알맞는 결정할 수 있습니다.
첫번째 옵션은 보여주는(presentation) 상태(state)를 수정해서 스스로 닫도록 뷰에게 알리는 것입니다. 이를 하기 위해서, 우선 새로운 environment property를 닫고자 하는 뷰에 추가하세요.
@Environment(\.presentationMode) var presentationMode
그리고 나서 준비가 되면, 다음 코드 줄을 사용해서 뷰 스스로 닫습니다.
self.presentationMode.wrappedValue.dismiss()
다른 옵션은 보여준 뷰에 바인딩을 전달하는 것이므로, 바인딩의 값을 다시 false로 변경할 수 있습니다.
예를들어, 다음과 같이 @State 프로퍼티를 가진 ViewA가 있습니다.
@State var showingNewUserView = false
다음과 같이, 시트(sheet)를 사용해서 NewUserView를 보여줄 것입니다.
.sheet(isPresented: $showingNewUserView) {
NewUserView()
}
바인딩 접근법을 사용해서, 닫고(dismissing), 대상 뷰(sheet에서 보여진 것)를 수정할 것이므로, 뷰을 보여주는데 사용된 것과 동일한 타입의 바인딩을 가지고 있습니다.
위의 예제에서 showingNewUserView가 true 였을때, 시트(sheet)를 보여줬으므로, 다음과 같이 NewUserView에 Boolean 바인딩을 추가해야 합니다.
@Binding var isPresented: Bool
NewUserView가 스스로 닫는(dismiss) 것을 원할때, 다음과 같이 다시 isPresented를 false로 설정하면 됩니다.
self.isPresented = false
이제 중요한 부분입니다 : 대상 뷰(예제에서 NewUserView)를 만들때, 초기화 부분에 바인딩으로 전달해야 하므로, Swift는 Boolean으로 작업해야 하는 부분을 알고 있습니다.
따라서, 이전 시트 코드를 다음과 같이 교체할 수 있습니다.
.sheet(isPresented: $showingNewUserView) {
NewUserView(isPresented: self.$showingNewUserView)
}
이러한 접근법을 사용해서, SwiftUI는 2개의 뷰에서 동일한 Boolen값을 읽고 쓸것이며, NewUserView가 Boolean을 다시 false로 설정할때 시트(sheet)가 자동으로 숨겨질 것입니다.
'SwiftUI > Presenting views' 카테고리의 다른 글
How to present a new view using sheets (0) | 2019.11.22 |
---|---|
How to push a new view when a list row is tapped (0) | 2019.11.22 |
How to push a new view onto a NavigationView (0) | 2019.11.22 |