티스토리 뷰

 

SwiftUI로 프로젝트를 하는데 이런 장바구니 화면에서 문제가 생겼다.

첫번째 아이템이든 두번째 아이템이든 세번째 아이템이든 무엇을 삭제해도 마지막 아이템이 사라지는 이슈가 있었다. 근데 웃긴게 프린트 찍어보니까 뷰모델에서는 제대로 적용돼서 원하는 요소가 삭제됐는데 뷰에서는 그게 안 되는 것…

일단 해결을 했는데 index를 이용해서 삭제하는게 아니라 id를 이용해서 삭제를 하면 된다.

 

기존의 코드

// CartView.swift
@StateObject var viewModel = MyPageViewModel.shared

ForEach(viewModel.cartItems.indices, id: \.self) { index in
    CartCardView(viewModel: CartViewModel(viewModel.cartItems[index]),
                 isSelected: $viewModel.cartItems[index].selected,
                 count: $viewModel.cartItems[index].count,
                 cartItemId: $viewModel.cartItems[index].id)
    Divider()
}
// MyPageViewModel.swift
@Published var cartItems: [CartItem]

func removeCartItem(at index: Int) {
    guard cartItems.indices.contains(index) else {
        return
    }
    cartItems.remove(at: index)
}

 

새로운 코드

// CartView.swift
@StateObject var viewModel = MyPageViewModel.shared

ForEach($viewModel.cartItems) { $cartItem in
    CartCardView(viewModel: CartViewModel(cartItem),
                 isSelected: $cartItem.selected,
                 count: $cartItem.count)
    Divider()
}
// MyPageViewModel.swift
 @Published var cartItems: [CartItem]

func removeCartItem(id: Int) {
    cartItems.removeAll { $0.id == id }
}

 

왜 이렇게 하면 해결이 되는지 이유는 자세히 모르겠다… 나중에 찾으면 다시 올려야지

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함