diff --git a/tutorial.xcodeproj/project.xcworkspace/xcuserdata/raymondkim.xcuserdatad/UserInterfaceState.xcuserstate b/tutorial.xcodeproj/project.xcworkspace/xcuserdata/raymondkim.xcuserdatad/UserInterfaceState.xcuserstate index 2a4b582..f68aa93 100644 Binary files a/tutorial.xcodeproj/project.xcworkspace/xcuserdata/raymondkim.xcuserdatad/UserInterfaceState.xcuserstate and b/tutorial.xcodeproj/project.xcworkspace/xcuserdata/raymondkim.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/tutorial/Views/Helpers/FavoriteButton.swift b/tutorial/Views/Helpers/FavoriteButton.swift new file mode 100644 index 0000000..bc5eb55 --- /dev/null +++ b/tutorial/Views/Helpers/FavoriteButton.swift @@ -0,0 +1,34 @@ +// +// FavoriteButton.swift +// tutorial +// +// Created by 김제필 on 8/11/22. +// + +import SwiftUI + +struct FavoriteButton: View { + // 3.6.2. 버튼의 현재 상태를 저장할 변수 isSet을 선언하고 @Binding 프로퍼티 래퍼를 추가한다. ⬇️ + @Binding var isSet: Bool + + var body: some View { + // 3.6.3. 버튼 생성 -> 기본 형태 지정 + Button { + isSet.toggle() + } label: { + Label("Toggle Favorite", systemImage: isSet ? "star.fill" : "star") + .labelStyle(.iconOnly) + .foregroundColor(isSet ? .yellow : .gray) + } + } +} + +struct FavoriteButton_Previews: PreviewProvider { + static var previews: some View { + // 3.6.2. ⬆️ 변수 isSet을 프리뷰에 추가한다. + FavoriteButton(isSet: .constant(true)) + } +} + + +// 3.6.3. 까지 도달했으면 LandmarkDetail.swift 파일로 이동 diff --git a/tutorial/Views/Landmarks/LandmarkDetail.swift b/tutorial/Views/Landmarks/LandmarkDetail.swift index ea1c206..a945cac 100644 --- a/tutorial/Views/Landmarks/LandmarkDetail.swift +++ b/tutorial/Views/Landmarks/LandmarkDetail.swift @@ -10,6 +10,13 @@ import SwiftUI struct LandmarkDetail: View { + // 3.6.5. computed property landmarkIndex를 생성하여 EnvironmentalObjet 변수인 modelData와 비교한다. + @EnvironmentObject var modelData: ModelData + + var landmarkIndex: Int { + modelData.landmarks.firstIndex(where: { $0.id == landmark.id})! + } + // 2.7.6. Landmark 프로퍼티 추가. 프리뷰 코드로 이동 ⬇️ var landmark: Landmark @@ -32,8 +39,13 @@ struct LandmarkDetail: View { // 1.3.1., 1.3.2. VStack 추가 VStack(alignment: .leading) { // 1.3.5. alignment 옵션 추가 - Text(landmark.name) // 2.7.8. 필요한 데이터 추가 - .font(.title) + // 3.6.6. HStack 내로 landmark.name TextView를 이동하고 옆에 FavoriteButton 추가 + HStack { + Text(landmark.name) // 2.7.8. 필요한 데이터 추가 + .font(.title) + + FavoriteButton(isSet: $modelData.landmarks[landmarkIndex].isFavorite) + } // 1.3.6. HStack 추가 HStack {