Swift公式チュートリアルメモ

Swift 公式チュートリアルのメモ

NavigationView

ex)リスト (LandmarkList.swift) と各観光地データ (LandmarkDetail.swift)を繋げる

NavigationView{ List(landmarkData) { landmark in NavigationLink(destination: LandmarkDetail()) { LandmarkRow(landmark: landmark) } } .navigationBarTitle(Text("Landmarks")) } --- NavigationView { List(landmarks) { landmark in NavigationLink { LandmarkDetail(landmark: landmark) } label: { LandmarkRow(landmark: landmark) } } .navigationBarTitle(Text("Landmarks")) }

これだけでつながるの凄すぎ

ScrollView

スクロールできるようになる。ちなみに List はこれなくてもスクロールできる。

スクロール可能な VStack = ScrollView。

systemName

標準実装のアイコンを呼び出す

Image(systemName: "star.fill")
@State

変更が起こるとビューの再描画が起こる

@State private var showFavoritesOnly = false ... Toggle(isOn: $showFavoritesOnly) { Text("Favorites only") }
@Published

変更が起こると全てのビューの再描画が起こる

final class ModelData: ObservableObject { @Published var landmarks: [Landmark] = load("landmarkData.json") }
@EnvironmentObject

全てのビューに共通して影響を与える

@EnvironmentObject var modelData: ModelData
@Binding

難しかったので下記記事参照

Transition
extension AnyTransition { static var moveAndFade: AnyTransition { .asymmetric( insertion: .move(edge: .trailing).combined(with: .opacity), // イン removal: .scale.combined(with: .opacity) // アウト ) } } --- HikeDetail(hike: hike) .transition(.moveAndFade)
listRowInserts
List { modelData.features[0].image .resizable() .scaledToFill() .frame(height: 200) .clipped() .listRowInsets(EdgeInsets()) ForEach(modelData.categories.keys.sorted(), id: \.self) { key in CategoryRow(categoryName: key, items: modelData.categories[key]!) } .listRowInsets(EdgeInsets()) }
Image in a image block
Tab
struct ContentView: View { @State private var selection: Tab = .featured enum Tab { case featured case list } var body: some View { TabView(selection: $selection) { CategoryHome() .tabItem { Label("Featured", systemImage: "star") } .tag(Tab.featured) LandmarkList() .tabItem { Label("List", systemImage: "list.bullet") } .tag(Tab.list) } } }
toolbar
NavigationView { ... .toolbar { Button { showingProfile.toggle() } label: { Label("User Profile", systemImage: "person.crop.circle") } } }
Image in a image block
sheet

下からみょんって出てくるやつ

NavigationView { .sheet(isPresented: $showingProfile) { ProfileHost() .environmentObject(modelData) } }
Image in a image block
listStyle

横いっぱいリスト

List { ... } .listStyle(.insert)
Image in a image block
EditButton()

よく見るあれは組み込みだった

EditButton()
Image in a image block

onAppear(perform:), onDisappear(perform:)

現れた時、消えた時に動作する

ProfileEditor(profile: $draftProfile) .onAppear { draftProfile = modelData.profile } .onDisappear { modelData.profile = draftProfile }