반응형
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
}
}
}
반응형