0% found this document useful (0 votes)
21 views27 pages

SwiftUI-3-Handling User Input

Uploaded by

Tâm Trần
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views27 pages

SwiftUI-3-Handling User Input

Uploaded by

Tâm Trần
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

3.

SwiftUI
1
Marketing /
Report
- Handling user input

1
[Link]
2
Marketing /
Report
- Handling user input

2
import Foundation
[Link]
3 - Handling user input import SwiftUI
import CoreLocation

struct Landmark: Hashable, Codable, Identifiable


{
var id: Int
var name: String
var park: String
var state: String
var description: String
var isFavorite: Bool

private var imageName: String


var image: Image {
Image(imageName)
}

private var coordinates: Coordinates


var locationCoordinate:
CLLocationCoordinate2D {
CLLocationCoordinate2D(
latitude: [Link],
longitude: [Link])
}

struct Coordinates: Hashable, Codable {


Marketing /

var latitude: Double


var longitude: Double
}
Report

[Link]
3
import SwiftUI
[Link]
4 - Handling user input
struct LandmarkRow: View {
var landmark: Landmark

var body: some View {


HStack {
[Link]
.resizable()
.frame(width: 50, height: 50)
Text([Link])

Spacer()

if [Link] {
Image(systemName: "[Link]")
}
}
}
}

#Preview {
Group {
LandmarkRow(landmark: landmarks[0])
LandmarkRow(landmark: landmarks[1])
}
Marketing /

}
Report

[Link]
4
[Link]
5 - Handling user input import SwiftUI

struct LandmarkRow: View {


var landmark: Landmark

var body: some View {


HStack {
[Link]
.resizable()
.frame(width: 50, height: 50)
Text([Link])

Spacer()

if [Link] {
Image(systemName: "[Link]")
.foregroundStyle(.yellow)
}
}
}
}

#Preview {
Group {
Marketing /

LandmarkRow(landmark: landmarks[0])
LandmarkRow(landmark: landmarks[1])
}
Report

[Link]
5
[Link]
6
Marketing /
Report
- Handling user input

6
[Link]
7 - Handling user input import SwiftUI

struct LandmarkList: View {


@State private var showFavoritesOnly = false

var body: some View {


NavigationSplitView {
List(landmarks) { landmark in
NavigationLink {
LandmarkDetail(landmark:
landmark)
} label: {
LandmarkRow(landmark:
landmark)
}
}
.navigationTitle("Landmarks")
} detail: {
Text("Select a Landmark")
}
}
}

#Preview {
LandmarkList()
}
Marketing /
Report

[Link]
7
[Link]
8
Marketing /
Report
- Handling user input

8
[Link]
9 - Handling user input import SwiftUI

struct LandmarkList: View {


@State private var showFavoritesOnly
= true

var filteredLandmarks: [Landmark] {


[Link] { landmark in
(!showFavoritesOnly ||
[Link])
}
}

var body: some View {


NavigationSplitView {
List(filteredLandmarks) {
landmark in
NavigationLink {

LandmarkDetail(landmark: landmark)
} label: {

LandmarkRow(landmark: landmark)
}
}

.navigationTitle("Landmarks")
} detail: {
Text("Select a Landmark")
}
}
}
Marketing /

#Preview {
Report

LandmarkList()
}

[Link]
9
[Link]
10
Marketing /
Report
- Handling user input

10
[Link]
11 - Handling user input import SwiftUI

struct LandmarkList: View {


@State private var showFavoritesOnly =
true

var filteredLandmarks: [Landmark] {


[Link] { landmark in
(!showFavoritesOnly ||
[Link])
}
}

var body: some View {


NavigationSplitView {
List {
Toggle(isOn:
$showFavoritesOnly) {
Text("Favorites only")
}

ForEach(filteredLandmarks) {
landmark in
NavigationLink {

LandmarkDetail(landmark: landmark)
} label: {
LandmarkRow(landmark:
landmark)
}
}
}
.navigationTitle("Landmarks")
} detail: {
Text("Select a Landmark")
Marketing /

}
}
}
Report

[Link] #Preview {
LandmarkList()
}

11
[Link]
12 - Handling user input import SwiftUI

struct LandmarkList: View {


@State private var showFavoritesOnly = false

var filteredLandmarks: [Landmark] {


[Link] { landmark in
(!showFavoritesOnly || [Link])
}
}

var body: some View {


NavigationSplitView {
List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorites only")
}

ForEach(filteredLandmarks) { landmark in
NavigationLink {
LandmarkDetail(landmark: landmark)
} label: {
LandmarkRow(landmark: landmark)
}
}
}
.animation(.default, value: filteredLandmarks)
.navigationTitle("Landmarks")
} detail: {
Text("Select a Landmark")
}
}
}
Marketing /

#Preview {
LandmarkList()
}
Report

[Link]
12
[Link]
13
Marketing /
Report
- Handling user input

13
[Link]
14
Marketing /
Report
- Handling user input

14
[Link]
15 - Handling user input import Foundation

@Observable
class ModelData {
var landmarks: [Landmark] = load("[Link]")
}

func load<T: Decodable>(_ filename: String) -> T {


let data: Data

guard let file = [Link](forResource: filename,


withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}

do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main
bundle:\n\(error)")
}

do {
let decoder = JSONDecoder()
return try [Link]([Link], from: data)
} catch {
fatalError("Couldn't parse \(filename) as
\([Link]):\n\(error)")
}
Marketing /

}
[Link]
Report

15
[Link]
16
Marketing /
Report
- Handling user input

16
[Link]
17 - Handling user input import SwiftUI

struct LandmarkList: View {


@Environment([Link]) var modelData
@State private var showFavoritesOnly = false

var filteredLandmarks: [Landmark] {


[Link] { landmark in
(!showFavoritesOnly || [Link])
}
}

var body: some View {


NavigationSplitView {
List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorites only")
}

ForEach(filteredLandmarks) { landmark in
NavigationLink {
LandmarkDetail(landmark: landmark)
} label: {
LandmarkRow(landmark: landmark)
}
}
}
.animation(.default, value: filteredLandmarks)
.navigationTitle("Landmarks")
} detail: {
Text("Select a Landmark")
}
}
Marketing /

}
Report

#Preview {
LandmarkList()
.environment(ModelData())
}

17
[Link]
[Link]
18 - Handling user input import SwiftUI

struct LandmarkDetail: View {


var landmark: Landmark

var body: some View {


ScrollView {
MapView(coordinate: [Link])
.frame(height: 300)

CircleImage(image: [Link])
.offset(y: -130)
.padding(.bottom, -130)

VStack(alignment: .leading) {
Text([Link])
.font(.title)

HStack {
Text([Link])
Spacer()
Text([Link])
}
.font(.subheadline)
.foregroundStyle(.secondary)

Divider()

Text("About \([Link])")
.font(.title2)
Text([Link])
}
.padding()
}
Marketing /

.navigationTitle([Link])
.navigationBarTitleDisplayMode(.inline)
}
}
Report

#Preview {
LandmarkDetail(landmark: ModelData().landmarks[0])
}

18
[Link]
[Link]
19 - Handling user input import SwiftUI

struct LandmarkRow: View {


var landmark: Landmark

var body: some View {


HStack {
[Link]
.resizable()
.frame(width: 50, height: 50)
.cornerRadius(5)
Text([Link])

Spacer()

if [Link] {
Image(systemName: "[Link]")
.imageScale(.medium)
.foregroundStyle(.yellow)
}
}
}
}

#Preview {
let landmarks = ModelData().landmarks
return Group {
LandmarkRow(landmark: landmarks[0])
Marketing /

LandmarkRow(landmark: landmarks[1])
}
}
Report

19
[Link]
[Link]
20 - Handling user input import SwiftUI

struct ContentView: View {


var body: some View {
LandmarkList()
}
}

#Preview {
ContentView()
.environment(ModelData())
}

[Link]

import SwiftUI

@main
struct LandmarksApp: App {
@State private var modelData = ModelData()

var body: some Scene {


WindowGroup {
ContentView()
.environment(modelData)
}
}
}
Marketing /

[Link]
Report

20
[Link]
21
Marketing /
Report
- Handling user input

21
[Link]
22
Marketing /
Report
- Handling user input

22
[Link]
23 - Handling user input
import SwiftUI

struct FavoriteButton: View {


@Binding var isSet: Bool

var body: some View {


Text("Hello, World!")
}
}

#Preview {
FavoriteButton(isSet:
.constant(true))
}

[Link]
Marketing /
Report

23
[Link]
24 - Handling user input

import SwiftUI

struct FavoriteButton: View {


@Binding var isSet: Bool

var body: some View {


Button {
[Link]()
} label: {
Marketing /

Label("Toggle Favorite", systemImage: isSet ?


"[Link]" : "star")
.labelStyle(.iconOnly)
.foregroundStyle(isSet ? .yellow : .gray)
}
Report

}
[Link] }

#Preview {
FavoriteButton(isSet: .constant(true))
}
Landmarks Helper 24
[Link]
25 - Handling user input import SwiftUI

struct LandmarkDetail: View {


@Environment([Link]) var modelData
var landmark: Landmark

var landmarkIndex: Int {


[Link](where: { $[Link] == [Link] })!
}

var body: some View {


ScrollView {
MapView(coordinate: [Link])
.frame(height: 300)

CircleImage(image: [Link])
.offset(y: -130)
.padding(.bottom, -130)

VStack(alignment: .leading) {
Text([Link])
.font(.title)

HStack {
Text([Link])
Spacer()
Text([Link])
}
.font(.subheadline)
.foregroundStyle(.secondary)

Divider()

Text("About \([Link])")
.font(.title2)
Text([Link])
}
.padding()
}
Marketing /

.navigationTitle([Link])
.navigationBarTitleDisplayMode(.inline)
}
}
Report

#Preview {
let modelData = ModelData()
return LandmarkDetail(landmark: [Link][0])
.environment(modelData)
}

[Link] 25
[Link]
26 - Handling user input import SwiftUI

struct LandmarkDetail: View {


@Environment([Link]) var modelData
var landmark: Landmark

var landmarkIndex: Int {


[Link](where: { $[Link] == [Link] })!
}

var body: some View {


@Bindable var modelData = modelData

ScrollView {
MapView(coordinate: [Link])
.frame(height: 300)

CircleImage(image: [Link])
.offset(y: -130)
.padding(.bottom, -130)

VStack(alignment: .leading) {
HStack {
Text([Link])
.font(.title)
FavoriteButton(isSet: $[Link][landmarkIndex].isFavorite)
}

HStack {
Text([Link])
Spacer()
Text([Link])
}
.font(.subheadline)
.foregroundStyle(.secondary)

Divider()

Text("About \([Link])")
.font(.title2)
Text([Link])
}
Marketing /

.padding()
}
.navigationTitle([Link])
.navigationBarTitleDisplayMode(.inline)
}
Report

#Preview {
let modelData = ModelData()
return LandmarkDetail(landmark: [Link][0])
.environment(modelData)
[Link] } 1
[Link]
27
Marketing /
Report
- Handling user input

27

You might also like