SwiftUI Mapkit:如何引用数组中的值作为标记?

问题描述 投票:0回答:1

我是初学者,我有一个与编程相关的问题:

我有一个标记的数组,我想将其呈现为地图。市场已显示,所以没问题。

但是:我没有使用我的标记值,例如色调颜色。我知道如何获取值“坐标”(通过使用 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()
})

我试图通过在谷歌上阅读有关数组的所有内容来寻求帮助,但对于初学者来说,我没有找到任何东西。

arrays swiftui reference mapkit google-maps-markers
1个回答
0
投票

注意:代码末尾有一个额外的

)
,导致错误。

如果您知道如何获取标记的坐标,那么您就知道如何获取标记的任何其他属性。为了让事情更清晰,最好对变量使用描述性命名,包括适当使用单数和复数。

例如,在您的代码中:

  • 您的
    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 会有帮助。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.