导航到 NavigationLink 时如何重置 SwiftUI MapKit 坐标区域的中心?
How to reset a SwiftUI MapKit coordinate region's center when navigating to a NavigationLink?
有没有办法在出现时更新 MapView sheet/NavigationLink 的 MKCoordinateRegion?
我有一个视图正用于输入一些数据以根据街道地址创建 longitude/latitude 组合:
Create.swift:
@State var longitude:Double = -122.677579; // Default longitude
@State var latitude:Double = 45.515519; // Default latitude
@State var streetAddress:String = ""; // Empty string
@State private var isShowing = false;
var body:some View {
VStack {
/* Take in the street address string via TextField */
Button(action:{validate()}, label:"Next")
}
.sheet(isPresented:$isShowing) {
LocationPicker(longitude:self.longitude, latitude:self.latitude)
};
}
func validate() {
var isValid:Bool = false;
/*
1. convert the street address to longitude and latitude
2. store long/lat in self.longitude, self.latitude
3. set isValid to true
*/
isShowing = true;
}
流量:
- 接受用户的街道地址
- 单击 'next' 按钮通过将街道地址转换为 longitude/latitude
来验证街道地址
- 这些经度和纬度值存储在状态变量中
- isShowing 设置为 true,调出包含
LocationPicker
视图的 .sheet
。
LocationPicker.swift:
struct LocationPicker: View {
@State var latitude:Double;
@State var longitude:Double;
var span:MKCoordinateSpan = MKCoordinateSpan(
latitudeDelta: 0.009,
longitudeDelta: 0.009
)
@State var region:MKCoordinateRegion;
init(latitude:Double, longitude:Double) {
_latitude = State(initialValue: latitude)
_longitude = State(initialValue: longitude)
_region = State(initialValue :MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),
span: self.span
))
}
var body:some View {
Map(coordinateRegion: $region,
showsUserLocation: false
)
/* ... */
}
}
此配置的问题是 Create.swift
中的 .sheet
的 LocationPicker
在呈现 Create.swift
视图时被呈现。所以当我把longitude/latitude的状态传给sheet的LocationPicker
的时候,传的是默认值,打开地图时出现的中心点是默认坐标,而不是由 validate()
.
中的 streetAddress
生成
我尝试在 Create.swift
中同时使用不可见的 NavigationLink
和 .sheet
,但两者都与父对象同时呈现。我尝试使用 @Binding
双打 LocationPicker.swift
:
struct LocationPicker: View {
@Binding var latitude:Double;
@Binding var longitude:Double;
var span:MKCoordinateSpan = MKCoordinateSpan(
latitudeDelta: 0.009,
longitudeDelta: 0.009
)
@State var region:MKCoordinateRegion;
init(latitude:Binding<Double>, longitude:Binding<Double>) {
_latitude = latitude
_longitude = longitude
_region = State(initialValue :MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),
span: self.span
))
}
var body:some View {
Map(coordinateRegion: $region,
showsUserLocation: false
)
/* ... */
}
但是,CLLocationCoordinate2D
不接受 Binding<Double>
作为纬度或经度的数据类型。
当您将 Binding
传递给 init 时,如果您需要使用 Binding
中包含的值,则必须使用 .wrappedValue
来访问基础值。在这种情况下,您传入两个 Binding<Double>
并试图使用它们创建一个 CLLocationCoordinate2D
,因此初始化程序必须如下所示:
init(latitude:Binding<Double>, longitude:Binding<Double>) {
// Binding
_latitude = latitude
// Binding
_longitude = longitude
_region = State(initialValue :MKCoordinateRegion(
// not Bindings
center: CLLocationCoordinate2D(latitude: latitude.wrappedValue, longitude: longitude.wrappedValue),
span: self.span
))
}
有没有办法在出现时更新 MapView sheet/NavigationLink 的 MKCoordinateRegion?
我有一个视图正用于输入一些数据以根据街道地址创建 longitude/latitude 组合:
Create.swift:
@State var longitude:Double = -122.677579; // Default longitude
@State var latitude:Double = 45.515519; // Default latitude
@State var streetAddress:String = ""; // Empty string
@State private var isShowing = false;
var body:some View {
VStack {
/* Take in the street address string via TextField */
Button(action:{validate()}, label:"Next")
}
.sheet(isPresented:$isShowing) {
LocationPicker(longitude:self.longitude, latitude:self.latitude)
};
}
func validate() {
var isValid:Bool = false;
/*
1. convert the street address to longitude and latitude
2. store long/lat in self.longitude, self.latitude
3. set isValid to true
*/
isShowing = true;
}
流量:
- 接受用户的街道地址
- 单击 'next' 按钮通过将街道地址转换为 longitude/latitude 来验证街道地址
- 这些经度和纬度值存储在状态变量中
- isShowing 设置为 true,调出包含
LocationPicker
视图的.sheet
。
LocationPicker.swift:
struct LocationPicker: View {
@State var latitude:Double;
@State var longitude:Double;
var span:MKCoordinateSpan = MKCoordinateSpan(
latitudeDelta: 0.009,
longitudeDelta: 0.009
)
@State var region:MKCoordinateRegion;
init(latitude:Double, longitude:Double) {
_latitude = State(initialValue: latitude)
_longitude = State(initialValue: longitude)
_region = State(initialValue :MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),
span: self.span
))
}
var body:some View {
Map(coordinateRegion: $region,
showsUserLocation: false
)
/* ... */
}
}
此配置的问题是 Create.swift
中的 .sheet
的 LocationPicker
在呈现 Create.swift
视图时被呈现。所以当我把longitude/latitude的状态传给sheet的LocationPicker
的时候,传的是默认值,打开地图时出现的中心点是默认坐标,而不是由 validate()
.
streetAddress
生成
我尝试在 Create.swift
中同时使用不可见的 NavigationLink
和 .sheet
,但两者都与父对象同时呈现。我尝试使用 @Binding
双打 LocationPicker.swift
:
struct LocationPicker: View {
@Binding var latitude:Double;
@Binding var longitude:Double;
var span:MKCoordinateSpan = MKCoordinateSpan(
latitudeDelta: 0.009,
longitudeDelta: 0.009
)
@State var region:MKCoordinateRegion;
init(latitude:Binding<Double>, longitude:Binding<Double>) {
_latitude = latitude
_longitude = longitude
_region = State(initialValue :MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),
span: self.span
))
}
var body:some View {
Map(coordinateRegion: $region,
showsUserLocation: false
)
/* ... */
}
但是,CLLocationCoordinate2D
不接受 Binding<Double>
作为纬度或经度的数据类型。
当您将 Binding
传递给 init 时,如果您需要使用 Binding
中包含的值,则必须使用 .wrappedValue
来访问基础值。在这种情况下,您传入两个 Binding<Double>
并试图使用它们创建一个 CLLocationCoordinate2D
,因此初始化程序必须如下所示:
init(latitude:Binding<Double>, longitude:Binding<Double>) {
// Binding
_latitude = latitude
// Binding
_longitude = longitude
_region = State(initialValue :MKCoordinateRegion(
// not Bindings
center: CLLocationCoordinate2D(latitude: latitude.wrappedValue, longitude: longitude.wrappedValue),
span: self.span
))
}