
v6 複雑なインターフェイス構築
Composing complex interfaces
section 1 カテゴリービュー Add a category view
featured , category 1 , category 2 を表示する
CategoryHome.swift を SwiftUI Viewで追加
struct CategoryHome: View {
var body: some View {
NavigationSplitView {
Text("Hello, World!")
.navigationTitle("Featured")
} detail: {
Text("Select a Landmark!")
}
}
}Section 2 カテゴリーリスト Create a category list
ModelのLandmarkにカテゴリーを追加
var category: Category
enum Category: String, CaseIterable, Codable {
case lakes = "Lakes"
case rivers = "Rivers"
case mountains = "Mountains"
}ModelDataにカテゴリー分けした辞書データを追加…
var categories: [String: [Landmark]] {
Dictionary (
grouping: landmarks,
by: { $0.category.rawValue }
)
}Dictionary で grouping で landmarksから by でできるそうで
struct CategoryHome: View {
@Environment(ModelData.self) var modelData
var body: some View {
NavigationSplitView {
List {
ForEach(modelData.categories.keys.sorted(), id: \.self) {
key in
Text(key)
}
}
.navigationTitle("Featured")
} detail: {
Text("Select a Landmark!")
}
}
}
#Preview {
CategoryHome()
.environment(ModelData())
}カテゴリーのkeyが表示されました。
Section 3 カテゴリー列を作成
Create a category row
vstackでタイトルとアイテム
hstackで横にアイテム並び,それをスクロールできるように
CategoryRow.swift SwiftUI View カテゴリーごとの列
VStackに
– カテゴリータイトル
– スクロールビュー > HStack (アイテム,CateogryItemを並べる)
CategoryItem.swift SwiftUI View
画像とタイトルのアイテム
で

となりました。
Section 4 カテゴリービューを完成 Complete the category view
CategoryHomeのtextのところを CategoryRowに変更でOK
Landmarkに isFeaturedを追加
ModelDataにfeaturesを追加
var features: [Landmark]{
landmarks.filter( $0.isFeatured )
}CategoryHomeのトップにフィーチャーリストを追加
Section 5 セクションからのナビゲーション
Add navigation between sections
CategoryRowで CategoryItemと選択されたらLandmarkDetailとなるnavigationLink
ForEach(items) {
landmark in
NavigationLink {
LandmarkDetail(landmark: landmark)
} label: {
CategoryItem(landmark: landmark)
}
}CategoryItemの表示を調整
renderingMode(.original)
Text().foregroundStyle(.primary)
あまり変化は?
ContentViewにタブを追加でfeaturedとlistをタブ切り替え

出来たようです。
なるほどという感じで、出来上がっているので簡単ですが
次は
App design and layout Working with UI controls



コメント