我是初学者,我有一个与编程相关的问题:
我有一个标记的数组,我想将其呈现为地图。市场已显示,所以没问题。
但是:我没有使用我的标记值,例如色调颜色。我知道如何获取值“坐标”(通过使用 n.coordinate),但是名称(字符串)或色调(颜色)不起作用,我根本不知道如何引用它(n.name 不起作用)。
import SwiftUI
import MapKit
struct MyLocationsArray: Identifiable { // MyLocationArray: Alle Locations sind in diesem Array erfasst
let id = UUID()
let number: Int // lfd. Nummer der eigenen Locations: 1, 2,3,4, ...
let category: Int // Kategorie-Nr.: Historisches, Strände, etc.
let name: String // Name der Location: "A-name"
let label: String // abgekürzter Name unter dem Marker: "A-Label"
let systemimage: String // Systemsymbol im Marker: "bird"
let tint: Color // Farbe des Markers: .yellow, .green, .blue
let coordinates: CLLocationCoordinate2D // Koordinaten der Location
let freeInt: Int // noch nicht belegt (Int) (default: 0)
let freeString: String // noch nicht belegt (String) (default: "")
}
struct ContentView: View {
let marker = [
MyLocationsArray(number: 1, category: 1, name: "A-Name", label: "A-Label", systemimage: "bird", tint: .orange, coordinates: CLLocationCoordinate2D(latitude: 42.2926854029081, longitude: -71.0679634411345), freeInt: 0, freeString: ""),
MyLocationsArray(number: 1, category: 1, name: "B-Name", label: "B-Label", systemimage: "bird", tint: .red, coordinates: CLLocationCoordinate2D(latitude: 42.2926854029081, longitude: -71.0679634411345), freeInt: 0, freeString: "")
]
var body: some View {
Text("Hello, World!")
Map {
ForEach(marker) { n in
Marker("", coordinate: n.coordinates) // ""** should be "label"**
.tint(.yellow) // **".yellow" should be individual **(see "let marker ...")
} // ForEach
}
}
}
#Preview {
ContentView()
})
我试图通过在谷歌上阅读有关数组的所有内容来寻求帮助,但对于初学者来说,我没有找到任何东西。
注意:代码末尾有一个额外的
)
,导致错误。
如果您知道如何获取标记的坐标,那么您就知道如何获取标记的任何其他属性。为了让事情更清晰,最好对变量使用描述性命名,包括适当使用单数和复数。
例如,在您的代码中:
MyLocationArray
对象数组应命名为 markers
,而不是 marker
,因为它包含多个对象,这些对象最终将成为地图上的标记。ForEach
将在 markers
上循环,并且闭包参数应为 marker
而不是 n
。所以你将拥有:ForEach(markers) { marker in
...这让所有人都更加清楚。
还有:
systemImage
的属性(请注意大写 I),因此可以将其作为参数添加到映射(我将其重命名为 icon
,只是为了使其更简单)。下面的完整代码包含所有这些更改:
import SwiftUI
import MapKit
struct MyLocationsArray: Identifiable { // MyLocationArray: Alle Locations sind in diesem Array erfasst
let id = UUID()
let number: Int // lfd. Nummer der eigenen Locations: 1, 2,3,4, ...
let category: Int // Kategorie-Nr.: Historisches, Strände, etc.
let name: String // Name der Location: "A-name"
let label: String // abgekürzter Name unter dem Marker: "A-Label"
let icon: String // Systemsymbol im Marker: "bird"
let tint: Color // Farbe des Markers: .yellow, .green, .blue
let coordinates: CLLocationCoordinate2D // Koordinaten der Location
let freeInt: Int // noch nicht belegt (Int) (default: 0)
let freeString: String // noch nicht belegt (String) (default: "")
}
struct MyLocationsContentView: View {
let markers = [ // <- for convenience, use plural for an array of objects
MyLocationsArray(number: 1, category: 1, name: "A-Name", label: "A-Label", icon: "bird", tint: .orange, coordinates: CLLocationCoordinate2D(latitude: 42.2926854029081, longitude: -71.0679634411345), freeInt: 0, freeString: ""),
MyLocationsArray(number: 1, category: 1, name: "B-Name", label: "B-Label", icon: "tortoise", tint: .red, coordinates: CLLocationCoordinate2D(latitude: 42.2936854029081, longitude: -71.0679634411345), freeInt: 0, freeString: "") // <- your two markers had the same coordinates - changed the second one to be in a slightly different location so both can be visible
]
var body: some View {
Text("MapKit Mastery") // <- for amusement, use a funny title
Map {
ForEach(markers) { marker in // <- for convenience, use singular to reference a single object in the array
Marker(marker.name, systemImage: marker.icon, coordinate: marker.coordinates) // <- can also be marker.label
.tint(marker.tint) // <- use the .tint property of the marker for the .tint modifier parameter
} // ForEach
}
}
}
#Preview {
MyLocationsContentView()
}
最后,我看到您的标记对象有一个类别属性。如果稍后您想要根据类别或所选类别显示标记,也许这个 answer 会有帮助。