본문 바로가기
iOS/SwiftUI

[SwiftUI] List, Observable 객체 활용 예시

by Sky Titan 2022. 1. 16.
728x90

Example

  • List에 Observable 객체 리스트를 이용하여 구성하고 아이템 추가, property 변경 등을 테스트 한다.
  • State 프로퍼티로 선언된 list 배열이 아이템 추가, 삭제 등을 observe하고 ObservableObject로 선언된 ListItem이 게시된 프로퍼티의 변경을 감지해 ListItemView를 다시 그리게 해준다.
  • ListItem: ObservableObject, Identifiable
    • name: @Published
    • age: @Published
  • ListItemView: ListItem의 내용을 보여주는 뷰
  • list: @State인 ListItem 배열
//
//  ContentView.swift
//

import SwiftUI

struct ContentView: View {
    
    @State var list: [ListItem] = [ListItem(name: "Park", age: 20), ListItem(name: "Kim", age: 22), ListItem(name: "Choi", age: 25)]
    
    var body: some View {
        VStack (spacing: 20) {
            List(list) { item in
                ListItemView(item: item)
            }
            
            //첫 번째 항목의 name 변경
            Button(action: {
                list[0].name = "Name Changed"
            }, label: {
                Text("Change Name")
            })
            
            //첫 번째 항목 삭제
            Button(action: {
                list.removeFirst()
            }, label: {
                Text("Remove First")
            })
            
            //마지막 항목 삭제
            Button(action: {
                list.popLast()
            }, label: {
                Text("Pop")
            })
            
            //새로운 항목 추가
            Button(action: {
                list.append(ListItem(name: "New Man", age: 30))
            }, label: {
                Text("Append")
            })
        }
    }
}

//ListItem의 내용을 보여주는 View
struct ListItemView: View {
    @ObservedObject var item: ListItem
    
    var body: some View {
        HStack {
            Text(item.name)
            Text(item.age.description)
        }
    }
}

class ListItem: ObservableObject, Identifiable {
    @Published var name: String
    @Published var age: Int
    var id: UUID = UUID()
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("iPhone 11")
            .previewDisplayName("아이폰 11")
    }
}

 

728x90

'iOS > SwiftUI' 카테고리의 다른 글

[SwiftUI] Slider 활용 예제  (0) 2022.01.18
[SwiftUI] Environment 객체  (0) 2022.01.16
[SwiftUI] Observable 객체  (0) 2022.01.16
[SwiftUI] 상태 바인딩 (State Binding)  (0) 2022.01.15
[SwiftUI] 상태 프로퍼티 (State Property)  (0) 2022.01.15

댓글