SwiftUI Essentials (SwiftUI の本質)

ユーザー入力の処理



訳注:以下、必要な場所においては Mac と iPhone 両方のセクションを提供しています。
Mac → セクション 5、iPhone → セクション 105 とします。







    LandmarkList.swift


  1. import SwiftUI
  2. struct LandmarkList: View {
  3. @EnvironmentObject var modelData: ModelData
  4. @State private var showFavoritesOnly = false
  5. var filteredLandmarks: [Landmark] {
  6. landmarks.filter { landmark in
  7. (!showFavoritesOnly || landmark.isFavorite)
  8. }
  9. }
  10. var body: some View {
  11. NavigationView {
  12. List {
  13. Toggle(isOn: $showFavoritesOnly) {
  14. Text("Favorites only")
  15. }
  16. ForEach(filteredLandmarks) { landmark in
  17. NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
  18. LandmarkRow(landmark: landmark)
  19. }
  20. }
  21. }
  22. .navigationTitle("Landmarks")
  23. }
  24. }
  25. }
  26. struct LandmarkList_Previews: PreviewProvider {
  27. static var previews: some View {
  28. LandmarkList()
  29. .environmentObject(ModelData())
  30. }
  31. }



上記のリストの 8 行目を以下のように書き換えます。


  1. var filteredLandmarks: [Landmark] {
  2. modelData.landmarks.filter { landmark in
  3. (!showFavoritesOnly || landmark.isFavorite)



    LandmarkDetail.swift


  1. import SwiftUI
  2. struct LandmarkDetail: View {
  3. var landmark: Landmark
  4. var body: some View {
  5. ScrollView {
  6. MapView(coordinate: landmark.locationCoordinate)
  7. .ignoresSafeArea(edges: .top)
  8. .frame(height: 300)
  9. CircleImage(image: landmark.image)
  10. .offset(y: -130)
  11. .padding(.bottom, -130)
  12. VStack(alignment: .leading) {
  13. Text(landmark.name)
  14. .font(.title)
  15. .foregroundColor(.primary)
  16. HStack {
  17. Text(landmark.park)
  18. Spacer()
  19. Text(landmark.state)
  20. }
  21. .font(.subheadline)
  22. .foregroundColor(.secondary)
  23. Divider()
  24. Text("About \(landmark.name)")
  25. .font(.title2)
  26. Text(landmark.description)
  27. }
  28. .padding()
  29. }
  30. .navigationTitle(landmark.name)
  31. .navigationBarTitleDisplayMode(.inline)
  32. }
  33. }
  34. struct LandmarkDetail_Previews: PreviewProvider {
  35. static var previews: some View {
  36. LandmarkDetail(landmark: ModelData().landmarks[0])
  37. }
  38. }



    LandmarkRow.swift


  1. import SwiftUI
  2. struct LandmarkRow: View {
  3. var landmark: Landmark
  4. var body: some View {
  5. HStack {
  6. landmark.image
  7. .resizable()
  8. .frame(width: 50, height: 50)
  9. .cornerRadius(5)
  10. Text(landmark.name)
  11. Spacer()
  12. if landmark.isFavorite {
  13. Image(systemName: "star.fill")
  14. .imageScale(.medium)
  15. .foregroundColor(.yellow)
  16. }
  17. }
  18. }
  19. }
  20. struct LandmarkRow_Previews: PreviewProvider {
  21. static var landmarks = ModelData().landmarks
  22. static var previews: some View {
  23. Group {
  24. LandmarkRow(landmark: landmarks[0])
  25. LandmarkRow(landmark: landmarks[1])
  26. }
  27. .previewLayout(.fixed(width: 300, height: 70))
  28. }
  29. }



    ContentView.swift


  1. import SwiftUI
  2. struct ContentView: View {
  3. var body: some View {
  4. LandmarkList()
  5. }
  6. }
  7. struct ContentView_Previews: PreviewProvider {
  8. static var previews: some View {
  9. ContentView()
  10. .environmentObject(ModelData())
  11. }
  12. }



    LandmarksApp.swift


  1. import SwiftUI
  2. @main
  3. struct LandmarksApp: App {
  4. @StateObject private var modelData = ModelData()
  5. var body: some Scene {
  6. WindowGroup {
  7. ContentView()
  8. .environmentObject(modelData)
  9. }
  10. }
  11. }






セクション 1セクション 2セクション 3
セクション 4セクション 5セクション 6
セクション 101セクション 102セクション 103
セクション 104セクション 105セクション 106





目次
Xcode の新機能

フレームワーク

  • SwiftUI

  • ビューの作成と結合

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    ビルドリストとナビゲーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7

    セクション 8


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107

    セクション 108

    ユーザー入力の処理

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    パスとシェイプの描画

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    ビューと移行のアニメーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    複雑なインターフェースの構成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    UI コントロールを扱う

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    UIKit とのインターフェース

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    UIKit とのインターフェース

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    watchOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    macOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107