@AppStorage 심화편으로 돌아왔습니다.
이번 차트에서는 @AppStorage를 사용하여 프로젝트를 만들어 볼테데요.
기초편에서도 말했지만 간단히 짚고가지면 @AppStorage는 Int, String과 같은 원시타입만 저장할수 있어요
그래도 기억이 안난다 싶으면 블로그를 참고해보세요
https://yeomir.tistory.com/11
어서와(SwiftUi) AppStorage는 처음이지?
@AppStorage 란 무엇인가? - Swift에서는 앱을 빌드하고 실행할때 메모리에는 String과 Int형식으로 저장된다. 상태변화가 될때 사용하는 @State와 @StateObject랑 차이점은 뭔가요? A. 앱을 종료하면 메모리
yeomir.tistory.com
자 그럼 심화편 시작하겠습니다.
이 프로젝트를 만들어보겠습니다. 두둥탁!
// ContentView
struct ContentView: View {
@State private var text: String = ""
var body: some View {
VStack {
TextField("입력해주세요", text: $text)
.padding()
.textFieldStyle(.roundedBorder)
}
}
}
ContentView에 TextField를 생성해줍니다.
struct ContentView: View {
@State private var text: String = ""
var body: some View {
VStack {
TextField("입력해주세요", text: $text)
.padding()
.textFieldStyle(.roundedBorder)
HStack(spacing: 20) {
Button {
// 버튼을 눌렀을 때 텍스트 저장
} label: {
Text("텍스트 저장")
}
// 디자인적 요소 ( 굳이 필요없다면 삭제해도 됨 )
Rectangle()
.frame(width:1, height: 10)
Button {
// 버튼을 눌렀을때 다음 페이지로 이동
} label: {
Text("다음 페이지로")
}
}
}
}
}
직관적인 UI를 위해 버튼 부분을 꾸몄습니다...
1) 버튼을 눌렀을때 AppStorage에 저장하기
import SwiftUI
struct ContentView: View {
@AppStorage("newText") var newText: String = ""
@State private var text: String = ""
var body: some View {
VStack {
Text("\(newText) 이 텍스트가 입력되었습니다.")
TextField("입력해주세요", text: $text)
.padding()
.textFieldStyle(.roundedBorder)
HStack(spacing: 20) {
Button {
// 버튼을 눌렀을 때 텍스트 저장
newText = text
} label: {
Text("텍스트 저장")
}
Rectangle()
.frame(width:1, height: 10)
Button {
// 버튼을 눌렀을때 다음 페이지로 이동
} label: {
Text("다음 페이지로")
}
}
}
}
}
AppStorage를 추가해줍니다. AppStorage는 key와 value값으로 이뤄진건 다 아시죠?! 화면에 보여주기 위해 Text(newText)가 추가되었습니다.

여기서 보너스!!
현재 아무값도 입력되어있지 않은데, " "이 텍스트가 입력되었습니다 만 보이는데 입력이 저장 됐을때만 보여지게끔 하려면 어떻게 해야할까요???
정답은... newText를 옵셔널 처리하면 됩니다.

참 재밌죠? 자 그럼 이어서 진행해보겠습니다!
2) 다음페이지로 AppStorage값 넘기기
페이지를 넘길때는 다양한 방법이 있습니다. NavigationView / Sheet / FullcoverSheet ... 그중에서도 오늘은 NavigationView를 활용하여 다음페이지로 넘겨보겠습니다.
import SwiftUI
struct ContentView: View {
@AppStorage("newText") var newText: String?
@State private var text: String = ""
var body: some View {
NavigationView {
VStack {
if let newText = newText {
Text("\(newText) 이 텍스트가 입력되었습니다.")
}
TextField("입력해주세요", text: $text)
.padding()
.textFieldStyle(.roundedBorder)
HStack(spacing: 20) {
Button {
// 버튼을 눌렀을 때 텍스트 저장
newText = text
} label: {
Text("텍스트 저장")
}
Rectangle()
.frame(width:1, height: 10)
NavigationLink {
// 버튼을 눌렀을때 다음 페이지로 이동
NextView()
} label: {
Text("다음 페이지로")
}
}
}
}
}
}
}
1. NextView를 만들어줍니다.
2. VStack을 NavigationView로 감싸주고, 버튼을 NavigationLink로 바꿔주면 끝! 참 쉽죠?
3) NextView에서 전 화면에서 AppStorage값을 적용하려면 어떻게 해야할까?? .... @AppStorage를 똑같이 적으면 된다.
struct NextView: View {
@AppStorage("newText") var newText: String?
var body: some View {
if let newText = newText {
Text("\(newText) 여기는 두번째 페이지 입니다.")
}
}
}
어때요 참 쉽죠? 약간... 비슷한 느낌을 찾자면 @ObservedObject, @EnvironmentObject 이런 느낌적인 느낌...

초기화 버튼을 추가해보자
struct NextView: View {
@AppStorage("newText") var newText: String?
var body: some View {
VStack {
if let newText = newText {
Text("\(newText) 여기는 두번째 페이지 입니다.")
}
// 버튼 추가
Button {
// 첫번째 방법
newText = nil
// 두번째 방법
UserDefaults.standard.set("", forKey: "name")
} label: {
Text("텍스트 초기화하기")
}
}
}
}
이상으로 @AppStorage 심화편을 마치겠습니다.
'Swift' 카테고리의 다른 글
iOS Custom Calender 구현하기 (2) | 2023.04.17 |
---|---|
어서와 SwiftUI @FetchRequest는 처음이지? (0) | 2023.03.23 |
SwiftUI OpenAPI 적용시키기 (0) | 2023.02.14 |
우당탕탕 앱 출시 리젝... (0) | 2023.02.11 |
우당탕탕 팀 프로젝트 앱출시 (0) | 2023.02.09 |