Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- NotificationCenter
- viewlifecycle
- mvvm
- Git
- 회고
- SWIFTUI
- uikit
- array
- 고차함수
- SWIFT
- IOS
- error
- segue
- ScrollView
- self
- calendar
- protocol
- apns
- Refresh
- list
- 화면전환
- Switch
- http
- PushNotification
- 글또
- Observer
- singleton
- escaping
- class
- struct
Archives
- Today
- Total
seong_hye, the developer
오류 해결) List Refreshable 오류 본문
📘 오류 해결) List Refreshable 오류
앱을 만들던 중 List가 Refresh 되지 않는 오류가 있었다
처음 딱 떴을 때 refresh가 되었으면 좋겠는데 되지 않고 계속 문제가 되는 부분이 있어서
시도해 본 여러 방법과 해결방안에 대해 작성해보려 한다.
🔹 현재 어플 및 코드 축약
윗쪽 탭바와 그에 맞게 아래 리스트를 둔 화면을 만들고 싶어서
다음과 같은 코드를 활용해 아래 화면을 제작하였다
VStack {
ScrollView(.horizontal) {
...
}
TabView( .. ) {
List {
...
}
.refreshable { ... }
...
}
}
❌ 문제 상황
탭을 눌러 처음 딱 리스트가 떴을 때 아래로 내려도 refresh가 되지 않는 문제가 있다는 것이다.
🔹문제 이유
이 문제는 SwiftUi에서 ScrollView와 List가 중첩되었을 때 생기는 대표적인 충돌 문제였다
VStack 안에 ScrollView가 있고 그 아래에 List가 있으면,
SwiftUI가 스크롤과 제스처를 상위 ScrollView에만 연결하기 때문에 List의 .refreshable은 작동하지 않는 것이였다.
🔹해결 방안
List 대신 ScrollView + LazyVStack 조합을 활용
VStack {
ScrollView {
}
TabView( .. ) {
ScrollView {
LazyVStack {
...
}
}
...
}
}
🔍 시도해 본 다른 방법들
➡️ list의 문제인 줄 알았을 때
✅ NavigationStack 으로 감싸기
...
NavigationStack {
List {
...
}
}
✅ .listStyle(.plain) 사용하기
List {
...
}
.listStyle(.plain)
.refreshable { ... }
✅ .refreshable 이 너무 빨리 끝나 로딩이 안보이는 건지 시간 추가
.refreshable {
try await Task.sleep(nanoseconds: 1_000_000_000)
}
➡️TabView의 문제인 줄 알았을 때
✅ 탭 바꿀 때마다 리스트 초기화 트리거하기
TabView가 내부 뷰를 계속 유지하기 때문에 .onAppear 또는 .onChange(of:)로 상태를 초기화
TabView(selection: $selection) {
List {
...
}
.refreshable { ... }
}
.onChange(of: selection, { oldValue, newValue in
...
})
이 외에도 많은 방법을 수정해봤지만 해결하지 못해
알게 된 이유가 바로 ScrollView와 List를 같이 사용해 충돌이 생겼다는 것이였다.
🔹결과 화면
'IOS > Error' 카테고리의 다른 글
Comments