적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/SwiftUI

SwiftUI 리스트 더 불러오기 - List vs. LazyVStack

hongssup_ 2024. 11. 21. 18:42
반응형

SwiftUI 로 리뉴얼 작업을 하는 중인데, 더 불러오기 작업을 하면서 문제가 생겼다. 

 

1. ScrollView + LazyVStack

ScrollView(showsIndicators: false) {
    LazyVStack(alignment: .leading, spacing: 0) {
        ForEach(0 ..< feature.state.postList.count, id: \.self) { index in
            CardView(...)
                .onAppear {
                    if index == cardList.count - 1 {
                        // load more
                    }
            }
        }
    }
}

이런 식으로 ScrollView 안에 LazyVStack 넣어서 기능 구현은 다 되었는데,

CardView에 onAppear 로 마지막 카드가 화면에 뜨는 걸 감지할 수 있을 줄 알았더니, 화면에 보이는 것과 상관없이 그냥 데이터 불러옴과 동시에 모든 카드에 onAppear가 동시 호출 되는 것이었다!!

onAppear 는 포기하고 gpt와 claude 가 알려준 대로 GeometryReader 사용해서 scroll offset 으로 감지를 하고 load more 하려고 했지만.... offset 감지 드럽게 안되는구만 

 

그래서 ScrollView 아예 빼버리고 List로 돌림

 

2. List

List {
    ForEach(0..<cardList.count, id: \.self) { index in
        CardView(...)
            .onAppear {
                if index == cardList.count - 1 {
                    // load more
                }
            }
    }
    .buttonStyle(PlainButtonStyle())
    .listRowSeparator(.hidden)
    .listRowInsets(.init())
}
.hideScrollIndicator()

list 뭔가 예전에 불편한 게 있어서 잘 안썼는데 꽤 쓸만한걸? 

default 탑재된 친구들 modifier 써서 초기화(?)해주고 scroll indicator만 잘 숨겨주면 onAppear 감지는 아주 잘된다! 굿굿

func hideScrollIndicator() -> some View {
    if #available(iOS 16.0, *) {
        return self.scrollIndicators(.hidden)
    } else {
        return self.onAppear {
            UITableView.appearance().showsVerticalScrollIndicator = false
        }
    }
}
728x90
반응형