@Binding
- 뷰와 뷰 사이의 데이터를 연동시킨다

struct MyVStackView: View {
@Binding // 데이터를 연동시킨다
var isActived: Bool
init(isActived: Binding<Bool> = // 생성자
.constant(false)) { // 기본값을 false로 설정
_isActived = isActived
}
var body: some View {
VStack{ // Vertical Stack으로 수직으로 쌓는다.
Text("1!")
.fontWeight(.bold) // 1!! 텍스트를 굵게 설정
.font(.system(size: 40)) // 텍스트사이즈를 60으로 설정
.padding()
Text("2!")
.fontWeight(.bold) // 2!! 텍스트를 굵게 설정
.font(.system(size: 40))
.padding()
Text("3!")
.fontWeight(.bold) // 3!! 텍스트를 굵게 설정
.font(.system(size: 40))
.padding()
} // VStack
.background(self.isActived ? Color.green : Color.red) // isActived가 true이면 VStack의 배경색을 초록색으로 하고 false이면 빨강색으로 지정
.padding(self.isActived ? 10 : 0)
}
}
- MyVStackView

- ContentView
struct ContentView: View { // View
@State // 값의 변화를 감지 -> 뷰에 적용
private var isActived: Bool = false
var body: some View {
NavigationView{
VStack{
HStack{
// HStack안에 VStack을 3개 넣음
MyVStackView(isActived: $isActived) // ContentView의 isActived를 MyVStackView의 isActived로 연결
MyVStackView(isActived: $isActived)
MyVStackView(isActived: $isActived)
} // HStack
.padding(isActived ? 50 : 10)
.background(isActived ? Color.yellow : Color.black) // isActived가 만약 True일 땐 배경이 파란색이고 아닐 때엔 검은색으로 설정
.onTapGesture { // 탭 제스쳐 추가
print("HStack이 클릭됨")
withAnimation { // 애니메이션 효과 적용
self.isActived.toggle() // toggle() = isActived 가 True 이면 False로 False이면 True로 변경
}
}
NavigationLink(destination: MyTextView() ){ // NavigationLink를 클릭하면 MyTextView()View로 넘어간다.
Text("네비게이션") // 네비게이션링크에 대한 설정
.fontWeight(.heavy)
.font(.system(size: 40))
.padding()
.background(Color.orange)
.foregroundColor(Color.white)
.cornerRadius(30)
}
.padding(.top, 50)
} // VStack
} // NavigationView
}
}


struct MyTextView: View {
@Binding // 데이터를 연동시킨다
var isActived: Bool
init(isActived: Binding<Bool> = // 생성자
.constant(false)) { // 기본값을 false로 설정
_isActived = isActived
}
@State // 값의 변화를 감지 -> 뷰에 적용
private var index: Int = 0
private let backgroundColors = [ // 배경색 배열
Color.red,
Color.yellow,
Color.blue,
Color.green,
Color.orange
]
var body : some View {
VStack{
Spacer() // Text("배경 아이템 인덱스") 위에 공간을 채워준다.
Text("배경 아이템 인덱스 \(self.index)")
.font(.system(size: 30))
.fontWeight(.bold)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 100) // frame으로 꽉채운다.
Text("활성화 상태: \(String(isActived))")
.font(.system(size: 30))
.fontWeight(.bold)
.foregroundColor(self.isActived ? Color.yellow : Color.gray) // isActived가 true이면 Text의 폰트색을 노란색으로 하고 false이면 회색으로 지정
.background(Color.black)
Spacer() // Text("배경 아이템 인덱스") 아래의 공간을 채워준다.
}
.background(backgroundColors[index]) // background의 색을 backgroundColors 배열 안에 있는 색으로 지정
.onTapGesture {
print("배경아이템이 클릭됨")
if(self.index == self.backgroundColors.count - 1){ // self.index가 backgroundColors의 마지막 인덱스를 지칭하면 0으로 초기화
self.index = 0
} else {
self.index += 1
}
}
}
}
- MyTextView
