Add a custom Navigation Link for lazy loading | SwiftUI Crypto App #18
private var allCoinsList: some View {
List {
ForEach(viewModel.allCoins) { coin in
CoinRowView(coin: coin, showHoldingsColumn: false)
.listRowInsets(.init(top: 10, leading: 0, bottom: 0, trailing: 10))
.onTapGesture {
segue(coin: coin)
}
}
}
.listStyle(.plain)
}
List
내부에 NavigationLink
를 선언할 때 현재 클릭하지 않은 Row까지 모두 destination
으로 선언된 뷰가 초기화되는 이슈private func segue(coin: CoinModel) {
selectedCoin = coin
showDetailView.toggle()
}
onTapGesture
를 통해 실행되는 함수DetailView
를 그리기 위한 selectedCoin
에 해당 코인 데이터를 넘기고 showDetailView
변수 값을 토글함으로써 네비게이션 링크 활성화.background(
NavigationLink(destination: DetailLoadingView(coin: $selectedCoin), isActive: $showDetailView, label: {
EmptyView()
})
)
isActive
에 걸려 있는 showDetailView
값이 바뀔 때에만 가능isActive
시점에 초기화 보장import SwiftUI
struct DetailLoadingView: View {
@Binding var coin: CoinModel?
init(coin: Binding<CoinModel?>) {
self._coin = coin
}
var body: some View {
ZStack {
if let coin = coin {
DetailView(coin: coin)
}
}
}
}
DetailLoadingView
내부에서 상수 let
이 된 코인 데이터를 DetailView
로 넘기기DetailLoadingView
에서 그릴 수도 있음import SwiftUI
struct DetailView: View {
let coin: CoinModel
init(coin: CoinModel) {
self.coin = coin
}
var body: some View {
ZStack {
}
}
}