[SwiftUI] ForEach에서 View가 업데이트 안될때

kyle Kim·2022년 12월 27일
0

iOS개발

목록 보기
20/22

SwiftUI에서 ForEach를 사용할때가 많은데 ForEach에서 Looping되는 객체의 값이 변하는데도 내부의 View를 봤을때 업데이트가 안되는 경우가 있다. 내가 사용하는 방식이 완전 맞는건 아니지만 두가지 방법으로 View를 업데이트 시켜보겠다.

EX)

// Model
struct Schedule {
	var work : [String]
}
// ForEach에 사용될 array
@Published var schedules : [Schedule] = ["A", "B", "C", "D"]

// in View
VStack {
	ForEach(self.schedules, id: \.id) { schedule in
   		Text(schedule)
    }
}


// schedules의 item에 값을 변경하면
schedules[0] = "a"
// View에서는 "a"가 아니라 "A"가 그대로 나온다. 

SwiftUI는 View를 그리는데에 자원을 최소한으로 사용하려는 경향이 있다. 그래서 위와 같이 item의 id는 변화가 없는 경우나 item 수에 변화가 없는 경우와 같은 자원으로 처리하기 때문에 업데이트가 없다. 이런 경우 강제로 업데이트가 가능하도록 해줘야한다.

방법 1. Array를 지우고 새로운 값을 넣어준다.

let copiedSchedules = schedules // schedules 객체를 복사
schedules.removeAll() // schedules의 item들을 다 지운다. 
schedules = copiedSchedules //  복사본을 schedules에 넣어준다. 
  • schedules이라는 객체를 지웠다가 복사본을 넣어주기 때문에 ForEach 내부의 부분이 잠시 비워졌다가 다시 데이터들이 표시가 된다.

방법 2. item을 하나 추가하고 하나를 다시 지워준다.

schedules.append("E") // append이기 때문에 array의 마지막 부분에 새로운 item이 추가된다. 
schedules.removeLast() // schedules의 마지막 item("E")을 지운다. 
  • 방법 1과 다르게 깜빡임 현상은 나타나지 않는다.

마무리

API Call의 response로 업데이트 된 데이터가 들어올 경우 기존의 View를 업데이트 해줘야할 수도 있고 Navigation으로 왔다갔다할때도 사용해야할 수도 있다. 위와 같은 방법으로 해결 가능하다. 더 정규화된 방법을 찾아봐야할거같다.

profile
가고일(gagoil)의 개발일지

0개의 댓글