이전에는 아래오 같이 배열과 id를 주고 foreach 처럼 리스트를 만들었다.
var body: some View {
NavigationView {
List(todos){ todo in
NavigationLink(destination: DetailView(todo: $todo)){
TodoRow(todo: $todo)
}
}
}
}
하지만 @Binding으로 값을 넘기려니 $todo가 들어간 부분에 Use of unresolved identifier '$todo' 라는 에러 메세지가 뜬다.
todos배열은 @State로 래핑 되어있는데 그것이 문제인 것 같다.
그래서 다른 방법을 찾아봤다. StackOveflow
해당 글에서 답변에는 indices를 통해 인덱스를 이용하라 한다.
아래 코드와 같이 앞에 self.$todo[index] 이런식으로 하면 잘 동작 된다. self뒤에 $를 붙히는 것이 중요하다.
var body: some View {
NavigationView {
List(todos.indices){ index in
NavigationLink(destination: DetailView(todo: self.$todos[index])){
TodoRow(todo: self.$todos[index])
}
}
}
}
하지만 위와 같은 코드는 큰 단점이 있다. 배열에 값이 추가가 되어도 갱신이 되지 않는다.
이는 간단하게 해결 할 수 있다.
id:\self를 통해 id를 넘겨주면 배열 값에 개수가 변화해도 갱신이 된다.
var body: some View {
NavigationView {
List(todos.indices, id:\self){ index in
NavigationLink(destination: DetailView(todo: self.$todos[index])){
TodoRow(todo: self.$todos[index])
}
}
}
}
'Programming > SwiftUI' 카테고리의 다른 글
[SwiftUI] SwiftUI의 Lifecycle (0) | 2020.04.12 |
---|---|
[SwiftUI] @State 이해하기 (0) | 2019.12.18 |