フレームワークの統合

macOS アプリの作成




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









LandmarkCommands.swift


  1. import SwiftUI
  2. struct LandmarkCommands: Commands {
  3. var body: some Commands {
  4. SidebarCommands()
  5. }
  6. }
  7. private struct SelectedLandmarkKey: FocusedValueKey {
  8. typealias Value = Binding<.<Landmark>
  9. }
  10. extension FocusedValues {
  11. var selectedLandmark: Binding<Landmark>? {
  12. get { self[SelectedLandmarkKey.self] }
  13. set { self[SelectedLandmarkKey.self] = newValue }
  14. }
  15. }


LandmarkCommands.swift


  1. import SwiftUI
  2. struct LandmarkCommands: Commands {
  3. private struct MenuContent: View {
  4. @FocusedBinding(\.selectedLandmark) var selectedLandmark
  5. var body: some View {
  6. }
  7. }
  8. var body: some Commands {
  9. SidebarCommands()


LandmarkCommands.swift


  1. private struct MenuContent: View {
  2. @FocusedBinding(\.selectedLandmark) var selectedLandmark
  3. var body: some View {
  4. Button("\(selectedLandmark?.isFavorite == true ? "Remove" : "Mark") as Favorite") {
  5. selectedLandmark?.isFavorite.toggle()
  6. }
  7. .disabled(selectedLandmark == nil)
  8. }
  9. }


LandmarkCommands.swift


  1. Button("\(selectedLandmark?.isFavorite == true ? "Remove" : "Mark") as Favorite") {
  2. selectedLandmark?.isFavorite.toggle()
  3. }
  4. .keyboardShortcut("f", modifiers: [.shift, .option])
  5. .disabled(selectedLandmark == nil)
  6. }
  7. }


LandmarkCommands.swift


  1. var body: some Commands {
  2. SidebarCommands()
  3. CommandMenu("Landmark") {
  4. MenuContent()
  5. }
  6. }
  7. }


LandmarkList.swift


  1. import SwiftUI
  2. struct LandmarkList: View {
  3. @EnvironmentObject var modelData: ModelData
  4. @State private var showFavoritesOnly = false
  5. @State private var filter = FilterCategory.all
  6. @State private var selectedLandmark: Landmark?
  7. enum FilterCategory: String, CaseIterable, Identifiable {
  8. case all = "All"
  9. case lakes = "Lakes"
  10. case rivers = "Rivers"
  11. case mountains = "Mountains"
  12. var id: FilterCategory { self }
  13. }
  14. var filteredLandmarks: [Landmark] {
  15. modelData.landmarks.filter { landmark in
  16. (!showFavoritesOnly || landmark.isFavorite)
  17. && (filter == .all || filter.rawValue == landmark.category.rawValue)
  18. }
  19. }
  20. var title: String {
  21. let title = filter == .all ? "Landmarks" : filter.rawValue
  22. return showFavoritesOnly ? "Favorite \(title)" : title
  23. }
  24. var index: Int? {
  25. modelData.landmarks.firstIndex(where: { $0.id == selectedLandmark?.id })
  26. }
  27. var body: some View {
  28. NavigationView {
  29. List {
  30. ForEach(filteredLandmarks) { landmark in
  31. NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
  32. LandmarkRow(landmark: landmark)
  33. }
  34. }
  35. }
  36. .navigationTitle(title)
  37. .frame(minWidth: 300)
  38. .toolbar {
  39. ToolbarItem {
  40. Menu {
  41. Picker("Category", selection: $filter) {
  42. ForEach(FilterCategory.allCases) { category in
  43. Text(category.rawValue).tag(category)
  44. }
  45. }
  46. .pickerStyle(InlinePickerStyle())
  47. Toggle(isOn: $showFavoritesOnly) {
  48. Label("Favorites only", systemImage: "star.fill")
  49. }
  50. } label: {
  51. Label("Filter", systemImage: "slider.horizontal.3")
  52. }
  53. }
  54. }
  55. Text("Select a Landmark")
  56. }
  57. }
  58. }
  59. struct LandmarkList_Previews: PreviewProvider {
  60. static var previews: some View {
  61. LandmarkList()
  62. .environmentObject(ModelData())
  63. }
  64. }


LandmarkList.swift


  1. var body: some View {
  2. NavigationView {
  3. List(selection: $selectedLandmark) {
  4. ForEach(filteredLandmarks) { landmark in
  5. NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
  6. LandmarkRow(landmark: landmark)
  7. }
  8. .tag(landmark)
  9. }
  10. }
  11. .navigationTitle(title)


LandmarkList.swift


  1. Text("Select a Landmark")
  2. }
  3. .focusedValue(\.selectedLandmark, $modelData.landmarks[index ?? 0])
  4. }
  5. }
  6. struct LandmarkList_Previews: PreviewProvider {











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






目次
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


    セクション 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