본문 바로가기

Programming/SwiftUI

[SwiftUI] List에서 @Binding 전달하기

전체 소스코드

 

이전에는 아래오 같이 배열과 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

 

SwiftUI dynamic List with @Binding controls

How do I build a dynamic list with @Binding-driven controls without having to reference the array manually? It seems obvious but using List or ForEach to iterate through the array give all sorts of

stackoverflow.com

해당 글에서 답변에는 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