- Total
꿈꾸는리버리
SwiftUI Widget 딱대.. (3/3) : 위젯을 눌렀을 때 다른 화면으로 뜨게 하기 본문
☁️ Widget 시리즈
기본 시리즈
SwiftUI Widget 딱대.. (1/3) 위젯 기본 개념 + 구현
SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기
SwiftUI Widget 딱대.. (3/3) : 위젯을 눌렀을 때 다른 화면으로 뜨게 하기
에러 시리즈
SwiftUI Widget 딱대(짐).. : 위젯 memory 제한
SwiftUI Widget 딱대(짐).. : localization 적용
SwiftUI Widget 딱대(짐).. : 위젯에 폰트가 안 먹혀요...
SwiftUI Widget 딱대(짐).. : 딥링크가 안되는 뎁숑 ?
위젯을 누르면 앱의 홈이 아니라 다른 화면으로 넘어가고 싶어서 해당 내용을 공부했다.
우선은 기본 화면이다.
main에는 navigationlink로 이어지는 button이 있다. 그리고 그 버튼을 누르면 다음 화면으로 넘어간다.
코드는 다음과 같다.
struct ContentView: View {
@State var isPresent = false
var body: some View {
NavigationView {
NavigationLink(isActive: $isPresent) {
SecondView()
} label: {
Text("다음화면으로 가자")
.onTapGesture {
isPresent = true
}
}
.navigationBarTitle("Your Characters")
}
.onOpenURL(perform: { (url) in
print("dd")
self.isPresent = url == URL(string: "widgetPractice:///next")
})
}
}
struct SecondView: View {
var body: some View {
Text("다음화면임")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
위젯에서 어떤 걸 눌렀을 때 앱 화면으로 넘어가기 위해서는 해당 View의 URL이 필요하다.
(사람들이 widget deep link 라고 하더라..!?)
그래서 TimelineEntry 안에 url을 넣어주고,
struct SimpleEntry: TimelineEntry {
let date: Date
let configuration: ConfigurationIntent
let url = URL(string: "widgetPractice:///next") // 이부분
}
그리고 이렇게 widget에 widgetURL을 쓰면 앱이 열릴 때 어느 URL로 이동할지를 담아 보내준다고 한다.
struct widgetEntryView : View {
var entry: Provider.Entry
var body: some View {
Text(entry.date, style: .time)
.widgetURL(entry.url) // 이 부분
// entry에 굳이 넣을 필요없고, 아래와 같이 여기서 URL을 지정해도 됨
// .widgetURL(URL(string: "url string")
}
}
마지막으로 앱 내에서 그 시그널을 받는 부분은 이 onOpenURL 부분이다.
onOpenURL은 뷰가 scene이나 window에 대한 URL을 수신한다.
struct ContentView: View {
@State var isPresent = false
var body: some View {
NavigationView {
NavigationLink(isActive: $isPresent) {
SecondView()
} label: {
Text("다음화면으로 가자")
.onTapGesture {
isPresent = true
}
}
.navigationBarTitle("Your Characters")
}
// 이 부분
.onOpenURL(perform: { (url) in
self.isPresent = url == URL(string: "widgetPractice:///next")
})
}
}
그러면 이렇게 위젯을 눌렀을 때 해당 뷰가 열리는 것을 확인할 수 있다 !
추가적인 궁금증
궁금한게... 제일 처음 뷰에서 좀 더 깊은 뷰로 이동해야 할 때는 어떻게 해야 하는 걸까..?
누르는 버튼에 따라 달리하는 거는 appDelegate 또는 sceneDeleagate의 openURL이랑 link를 이용해서 한다는 데 이 부분도 공부가 필요할 거 같다.
'오뚝이 개발자 > SwiftUI' 카테고리의 다른 글
SwiftUI Widget 딱대(짐).. : 위젯 memory 제한 (2) | 2022.09.15 |
---|---|
swiftUI list drag and drop (0) | 2022.09.07 |
SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기 (0) | 2022.08.07 |
SwiftUI Widget 딱대.. (1/3) 위젯 기본 개념 + 구현 (0) | 2022.08.06 |
SwiftUI launchScreen(splash Image) 만들기 ( delay가 가능한.. ) (0) | 2022.08.04 |