본문 바로가기
IT/swift

100 days of SwiftUI - Day36

by 가능성1g 2024. 12. 1.
반응형

7번째 프로젝트 시작전 필요 기능 익히기

 

1. struct 와 class 차이

struct 의 바인딩은 @State로 되지만, class 는 그렇지 않다. 이전에 살펴본 값참조, 레퍼런스참조와 관련있음.

그래서 class 는 @State 가아닌 @Observable을 써야 뷰에서 변화를 감지하고 쓸 수 있다. 쓰는 위치도 변수 선언(클래스 인스턴스생성)이 아니라 클래스 선언쪽이다. 

 

2. 다른 뷰를 보이고 숨기는 방법

버튼에 .sheet modifier를 써서 보이게 할 수 있다. + 인자 넘기는 방법까지!

그리고 자기 자신을 숨기는거는 @Environment 라인을 이용해서 dismiss를 선언하고 호출하면된다.

struct SecondView: View {
	@Environment(\.dismiss) var dismiss
    let name: String

    var body: some View {
    VStack{
            Text("Hello, \(name)!")
            Button("Dismiss") {
               dismiss()
            }
        }
    }
}

struct ContentView: View {
    @State private var showingSheet = false

    var body: some View {
        Button("Show Sheet") {
            showingSheet.toggle()
        }
        .sheet(isPresented: $showingSheet) {
            SecondView(name: "urSunShine")
        }
    }
}

 

3. 아이템의 삭제

리스트 만 써도 되지만, 아이템 삭제를 위해 ForEach를 써서 나타내야 한다.  그리고 List에 modifier .onDeletet를 써서 삭제 가능

삭제하는 함수는 구현해서 연결해 준다!

NavigationStack 을 써서 EditButton을 쓰면 추가 삭제 인터페이스를 쉽게 추가 가능하다. ( Edit버튼 누르면 아이템 삭제 버튼들이 나옴)

struct ContentView: View {
    @State private var numbers = [Int]()
    @State private var currentNumber = 1

    var body: some View {
    NavigationStack {
            VStack {
                List {
                    ForEach(numbers, id: \.self) {
                        Text("Row \($0)")
                    }
                    .onDelete(perform: removeRows)
                }
                Button("Add Number") {
                    numbers.append(currentNumber)
                    currentNumber += 1
                }
            }
            .toolbar {
   		EditButton()
		}
        }
    }
    
    func removeRows(at offsets: IndexSet) {
    	numbers.remove(atOffsets: offsets)
	}
}

 

4. 데이터 저장하기

데이터 저장하는것은 UserDefaults 를 이용해서 가능 웹의 localDB같이 작은 형태만 (512k미만만) 저장하는게 좋다고 한다. 

struct ContentView: View {
    @State private var tapCount = UserDefaults.standard.integer(forKey: "Tap")

    var body: some View {
        Button("Tap count: \(tapCount)") {
            tapCount += 1
        }
        UserDefaults.standard.set(tapCount, forKey: "Tap")
    }
}

더 쉬운 방법으로는 @AppStorage 를 이용해 App의 저장영역에 저장하는것! ( 근데 먼가 더 제약사항이 큰게 있는건가.. 음.. 일단 이게 훨씬 쉬워보인다! )

struct ContentView: View {
    @AppStorage("tapCount") private var tapCount = 0

    var body: some View {
        Button("Tap count: \(tapCount)") {
            tapCount += 1
        }
    }
}
반응형