struct Test04: View {
@State private var wifiEnabled = true
@State private var userName = ""
var body: some View {
VStack{
Toggle(isOn: $wifiEnabled, label: {
Text("Enable Wi-Fi")
})
Image(systemName: wifiEnabled ? "wifi":"wifi.slash").resizable().frame(width: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, height: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/).foregroundColor(.red)
TextField("Enter user name",text:$userName)
Text(userName).font(.largeTitle)
}
}
}
🍹 systemName 이미지 참조체 : SF Symbol 드로잉의 내장된 라이브러리에 접근할 수 있게 한다. SF Symbol은 애플 플랫폼용 앱을 개발할 때 사용할 수 있는 많은 크기 조절이 가능한 벡터 이미지 모음
// 상태 바인딩
struct Test05: View {
@State private var wifiEnable = true
var body: some View {
VStack{
Toggle(isOn: $wifiEnable, label: {
Text("wifi")
})
//이미지 뷰어를 외부로 정의
//파라미터로 상태 속성을 보내준다
WifiImageView(wifiEnable:$wifiEnable)
}
}
}
//이미지 뷰를 외부로 따로 선언
struct WifiImageView:View{
//상태 바인딩
@Binding var wifiEnable : Bool
var body: some View{
Image(systemName: wifiEnable ? "wifi" : "wifi.slash")
}
}
// 간단한 observable 객체 선언
import Foundation
import Combine //Combime 프레임워크 import
class DemoData : ObservableObject{
@Published var userCount = 0
@Published var currentUser = ""
init(){
//데이터를 초기화하는 코드가 여기에 온다
updateDate()
}
func updateDate(){
// 데이터를 최신 상태로 유기하기 위한 코드가 여기에 온다
}
}
struct Test06_Observable: View {
//키워드 헷갈리지 않게 주의!!
@ObservedObject var demoData : DemoData
var body: some View {
Text("\(demoData.currentUser),you are user number \(demoData.userCount)")
}
}
struct Test06_Observable_Previews: PreviewProvider {
static var previews: some View {
Test06_Observable(demoData: DemoData())
}
}
let contentView = ContentView()
//DemoData 객체의 인스턴트를 저장
let demoData = DemoData()
if let windowScene = scene as? UIWindowScene{
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(demoData))
self.window = window'
window.makeKeyAndVisible()
}
//미리보기 뷰에서 environment 객체를 사용하려면 프리뷰 선언뷰를 수정해야한다
struct content_Previews: PreviewProvider{
static var previews: some View{
ContentView().environmentObject(DemoData())
}
}
사용자 인터페이스 레이아웃 내의 뷰 상태를 저장
현재 콘텐트 뷰에 관한 것
값은 임시적이어서 해당 뷰가 사라지면 값도 없어진다
사용자 인터페이스 밖에 있으며 앱 내의 SwiftUI 뷰 구조체의 하위 뷰에만 필요한 데이터에서 사용
데이터를 표시하는 클래스나 구조체는 ObservableObject 프로토콜을 따라야함
뷰와 바인딩될 프로퍼티는 @Published 프로퍼티 래퍼를 사용하여 선언
뷰 선언부에 Observable 객체 프로퍼티와 바인딩하려면 프로퍼티는 @ObseredObject 프로퍼티 래퍼를 사용
사용자 인터페이스 밖에 있으며 여러 뷰가 접근 해야하는 데이터에 사용
Observable 객체와 동일한 방법으로 선언
@EnvironmentObject 프로퍼티 래퍼를 사용하여 SwiftUI 뷰 파일 내에 선언
SceneDelegate.swift 파일의 코드를 통해 뷰 화면이 앱에 추가될 때 Enivronment 객체 또한 초기화해야 함