如何在 Swift UI 中初始化状态变量而不会收到错误"Cannot use instance member 'XXX' within property initializer;"



我想在MapView上放置一个用户位置,并在用户移动时更新位置。我使用@observedObject-Var作为处理位置管理器内容的类,使用@state-Var作为MKCoordinateRegion((类。然而,我遇到了一个问题,如果我在声明和定义@state var之前先声明@observedObject var,就会出现错误

("无法在属性初始值设定项中使用实例成员"纬度";属性初始值设置项在"self"可用之前运行"(

我看到其他人发布了这个问题,我尝试了.init((函数以及使用惰性变量。然而,问题出现了,@state变量的类型需要是MKCoordinateRegion((,因此需要用值初始化。我不理解如何解决这个问题的根源很可能是不理解如何加载视图的时间表,因为我只使用过UIBuilder,而没有使用过SwiftUI。任何帮助都将不胜感激!

struct MapView: View {
@ObservedObject var usersLocation = LocationManager()
var latitude: Double{ return((usersLocation.location?.coordinate.latitude ?? 0))}
var longitude: Double{ return((usersLocation.location?.coordinate.longitude ?? 0))}
@State var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: latitude , longitude: longitude),
span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
)
var body: some View {
Map(coordinateRegion: $region)
.onAppear()
Text(String(latitude));
}

}

问题是属性的值相互依赖,不能以这种方式声明它们。

但是您可以实现init方法

struct MapView: View {
@ObservedObject var usersLocation : LocationManager
var latitude: Double
var longitude: Double
@State var region : MKCoordinateRegion
init(manager : LocationManager) {
self.usersLocation = manager
let lat = manager.location?.coordinate.latitude ?? 0
self.latitude = lat
let long = manager.location?.coordinate.latitude ?? 0
self.longitude = long
let reg = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: lat , longitude: long),
span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
)
self._region = State<MKCoordinateRegion>(initialValue: reg)
}
var body: some View {
Map(coordinateRegion: $region)
.onAppear()
Text(String(latitude));
}

}

并在父视图中传递CCD_ 2并在那里声明为@StateObject

@StateObject var locationManager = LocationManager()
...
MapView(manager: locationManager)

您也可以使用类似的东西:

struct MapView: View {
@ObservedObject var usersLocation = LocationManager()
@State var latitude: Double = 0.0
@State var longitude: Double = 0.0
@State var region = MKCoordinateRegion()

var body: some View {
Map(coordinateRegion: $region)
.onAppear {
latitude = (usersLocation.location?.coordinate.latitude ?? 0.0)
longitude = (usersLocation.location?.coordinate.longitude ?? 0.0)
region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: latitude , longitude: longitude),
span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1))
}
}
}

相关内容

最新更新