SwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 'self' 可用之前运行

Posted

技术标签:

【中文标题】SwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 \'self\' 可用之前运行【英文标题】:SwiftUI Maps - Cannot use instance member within property initializer; property initializers run before 'self' is availableSwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 'self' 可用之前运行 【发布时间】:2021-12-27 10:29:31 【问题描述】:

我正在尝试将 MapKit 的 Map 与 SwiftUI 和动态纬度/经度值一起使用,这些值由导航堆栈上的父视图传递到视图中。 Swift 的所有 MapKit 文档都表明您需要将 @State 与 MKCoordinateRegion 一起使用,但始终将其与恒定的纬度/经度值一起使用。

struct PlaceDetail: View 
    let place: Place
    
    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: place.latitude, longitude: place.longitude),
        latitudinalMeters: 750,
        longitudinalMeters: 750
    )
    
    var body: some View 
        Map(coordinateRegion: region)
    

我希望能够通过父视图传入的place 对象提供的latitude/longitude 值动态地使用它。上述代码导致编译器错误:

Cannot use instance member 'place' within property initializer; property initializers run before 'self' is available

让这个视图按预期编译和工作的最简洁/最新的方法是什么?


编辑:我曾尝试使用初始化程序,但最终出现与分配状态有关的另一个错误:

struct PlaceDetail: View 
    let place: Place
    
    @State var region: MKCoordinateRegion
    
    init(place: Place) 
        self.place = place
        
        let region = MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: place.latitude, longitude: place.longitude),
            latitudinalMeters: 750,
            longitudinalMeters: 750
        )
        
        self.region = State(initialValue: region)
    
    
    var body: some View 
        Map(coordinateRegion: $region)
    

结果:

Cannot assign value of type 'State<MKCoordinateRegion>' to type 'MKCoordinateRegion'

【问题讨论】:

这能回答你的问题吗? How do I set an @State variable programmatically in SwiftUI 【参考方案1】:

我在最后的编辑中很接近,但我需要分配值 _region - 而不是前缀下划线。看起来这是一个私有设置器,这就是为什么您需要将值包装在 State 中的原因。并且不要忘记使用$ 前缀来使用视图中的实例变量。

struct PlaceDetail: View 
    let place: Place
    
    @State var region: MKCoordinateRegion
    
    init(place: Place) 
        self.place = place
        
        let region = MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: place.latitude, longitude: place.longitude),
            latitudinalMeters: 750,
            longitudinalMeters: 750
        )
        
        self._region = State(initialValue: region)
    
    
    var body: some View 
        Map(coordinateRegion: $region)
    


【讨论】:

以上是关于SwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 'self' 可用之前运行的主要内容,如果未能解决你的问题,请参考以下文章

Swift 不能在属性初始化器中使用实例成员

不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行

SwiftUI CS193P - 不能在属性初始化程序中使用实例成员“卡片”;属性初始化程序在“自我”可用之前运行

从 SwiftUI 颜色选择器中获取价值

SwiftUI 数组列表

@ViewBuilder 在使用其他属性初始化时抛出错误