微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Swift UI 中初始化状态变量而不出现错误“无法在属性初始值设定项中使用实例成员‘XXX’;”

如何解决如何在 Swift UI 中初始化状态变量而不出现错误“无法在属性初始值设定项中使用实例成员‘XXX’;”

我希望将用户位置放在 MapView 上,并在用户移动时更新位置。我使用@observedobject Var 作为处理位置管理器内容的类,使用@state Var 作为 MKCoordinateRegion() 类。但是,我遇到了一个问题,如果我在声明和定义 @state var 之前放置了 @observedobject var 的声明,我就会遇到错误

(“不能在属性初始化器中使用实例成员‘纬度’;属性初始化器在‘self’可用之前运行”)

我看到其他人发布了这个问题,我尝试了 .init() 函数以及使用惰性变量。然而,问题来了,@state var 需要是 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));
    }
    
}

并在父视图中传递 LocationManager 并将其声明为 @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),longitudeDelta: 0.1))
            }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。