Tag: SwiftUI/日本語チュートリアル3
var isFavorite: Bool
struct LandmarkRow: View { var landmark: Landmark var body: some View { HStack{ landmark.image .resizable() .frame(width: 50, height: 50) Text(landmark.name) Spacer() if landmark.isFavorite { Image(systemName: "star.fill") .imageScale(.medium) .foregroundColor(.yellow) } } }
struct LandmarkList: View { var showFavoritesOnly: Bool = true var body: some View { NavigationView{ List(landmarkData) { landmark in if !self.showFavoritesOnly || landmark.isFavorite{ NavigationLink(destination: LandmarkDetail(landmark: landmark)) { LandmarkRow(landmark: landmark) } } } .navigationBarTitle(Text("Landmarks")) } } }
struct LandmarkList: View { var showFavoritesOnly: Bool = true var body: some View { NavigationView{ List { ForEach(landmarkData) { landmark in if !self.showFavoritesOnly || landmark.isFavorite { NavigationLink(destination: LandmarkDetail(landmark: landmark)) { LandmarkRow(landmark: landmark) } } } } .navigationBarTitle(Text("Landmarks")) } } }
struct LandmarkList: View { @State var showFavoritesOnly: Bool = true var body: some View { NavigationView{ List { Toggle(isOn: $showFavoritesOnly) { Text("Favorites only") } ForEach(landmarkData) { landmark in if !self.showFavoritesOnly || landmark.isFavorite { NavigationLink(destination: LandmarkDetail(landmark: landmark)) { LandmarkRow(landmark: landmark) } } } } .navigationBarTitle(Text("Landmarks")) } } }
import SwiftUI import Combine final class UserData: ObservableObject { @Published var showFavoritesOnly = false @Published var landmarks = landmarkData }
struct LandmarkList: View { // @State var showFavoritesOnly: Bool = true @EnvironmentObject var userData: UserData var body: some View { NavigationView{ List { Toggle(isOn: $userData.showFavoritesOnly) { Text("Favorites only") } ForEach(userData.landmarks) { landmark in if !self.userData.showFavoritesOnly || landmark.isFavorite { NavigationLink(destination: LandmarkDetail(landmark: landmark)) { LandmarkRow(landmark: landmark) } } } } .navigationBarTitle(Text("Landmarks")) } } } struct LandmarkList_Previews: PreviewProvider { static var previews: some View { ForEach(["iPhone X"], id: \.self) { deviceName in LandmarkList() .previewDevice(PreviewDevice(rawValue: deviceName)) .previewDisplayName(deviceName) .environmentObject(UserData()) } } }
@main struct LandmarksApp: App { var body: some Scene { WindowGroup { LandmarkList().environmentObject(UserData()) } } }
struct LandmarkDetail: View { @EnvironmentObject var userData: UserData var landmark: Landmark var body: some View { VStack { MapView(coordinate: landmark.locationCoordinate) .edgesIgnoringSafeArea(.top) .frame(height: 300) CircleImage(image: landmark.image) .offset(y: -130) .padding(.bottom, -130) VStack(alignment: .leading) { Text(landmark.name) .font(.title) HStack { Text(landmark.park) .font(.subheadline) Spacer() Text(landmark.state) .font(.subheadline) } } .padding() Spacer() } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { LandmarkDetail(landmark: landmarkData[0]).environmentObject(UserData()) } }
var landmarkIndex: Int { userData.landmarks.firstIndex(where: { $0.id == landmark.id })! }
var body: some View { VStack { MapView(coordinate: landmark.locationCoordinate) .edgesIgnoringSafeArea(.top) .frame(height: 300) CircleImage(image: landmark.image) .offset(y: -130) .padding(.bottom, -130) VStack(alignment: .leading) { HStack { Text(landmark.name) .font(.title) Button(action: { // isFavoriteを切り替える self.userData.landmarks[self.landmarkIndex].isFavorite.toggle() }) { // もしお気に入りならば if self.userData.landmarks[self.landmarkIndex].isFavorite { // 塗り潰しされたスター Image(systemName: "star.fill") .foregroundColor(Color.yellow) } else { // そうでなければ白抜きスター Image(systemName: "star") .foregroundColor(Color.gray) } } } HStack { Text(landmark.park) .font(.subheadline) Spacer() Text(landmark.state) .font(.subheadline) } } .padding() Spacer() } }