使用MVVM模式处理SwiftUI和CoreLocation

陪审团

我正在尝试使用MVVM-Pattern实现SwiftUICoreLocation作为助手工作正常。但是,如何更改我的属性我实现了我in 这是我的问题。LocationManagerLocationViewModel@ObservedObjectLocationManagerLocationViewModel

我没有实现它们动态更改的属性的想法。我的LocationView中没有任何更改。通过按一个按钮,任何事情都可以正常工作一次。但是LocationViewModel必须在每次更改时更改属性LocationManager

总而言之,我想显示当前用户位置。

// Location Manager as Helper

import Foundation
import CoreLocation

class LocationManager: NSObject, ObservableObject {

    let locationManager = CLLocationManager()
    let geoCoder = CLGeocoder()

    @Published var location: CLLocation?
    @Published var placemark: CLPlacemark?

    override init() {
        super.init()
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
    }

    func geoCode(with location: CLLocation) {

        geoCoder.reverseGeocodeLocation(location) { (placemark, error) in
            if error != nil {
                print(error!.localizedDescription)
            } else {
                self.placemark = placemark?.first
            }
        }
    }
}

extension LocationManager: CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.first else { return }

        DispatchQueue.main.async {
            self.location = location
            self.geoCode(with: location)
        }

    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        // TODO
    }
}

// Location Model

import Foundation
import CoreLocation

struct Location {
    var location: CLLocation = CLLocation()
    var placemark: CLPlacemark = CLPlacemark()
}
// Location View Model

import SwiftUI
import CoreLocation

class LocationViewModel: ObservableObject {

    @ObservedObject var locationManager: LocationManager = LocationManager()

    @Published var location: Location

    init() {
        self.location = Location()
    }
}
// Location View

import SwiftUI

struct LocationView: View {

    @ObservedObject var locationViewModel: LocationViewModel = LocationViewModel()

    var body: some View {
        VStack(alignment: .leading) {
            Text("Latitude: \(self.locationViewModel.location.location.coordinate.latitude.description)")
            Text("Longitude: \(self.locationViewModel.location.location.coordinate.longitude.description)")
        }
    }
}

struct LocationView_Previews: PreviewProvider {
    static var previews: some View {
        LocationView()
    }
}

更新资料

现在,我已经设置了MapView

但是如何接收我的数据LocationManagerdidUpdateLocations方法正在中运行LocationManager

我想做的所有事情都出错了。我想MapView根据当前用户位置在我的区域上设置区域在UIKit中,这非常简单,但是在SwiftUI中,这很奇怪。

// Map View

import SwiftUI
import MapKit

struct MapView: UIViewRepresentable {

    @ObservedObject var locationManager: LocationManager = LocationManager()

    class Coordinator: NSObject, MKMapViewDelegate {

        var parent: MapView

        init(_ control: MapView) {
            self.parent = control
        }

    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> MKMapView {
        let mapView = MKMapView(frame: .zero)
        mapView.delegate = context.coordinator
        return mapView
    }

    func updateUIView(_ mapView: MKMapView, context: Context) {
        mapView.showsUserLocation = true
    }

}

struct MapView_Previews: PreviewProvider {
    static var previews: some View {
        MapView()
    }
}
他的脾气

SwiftUI 2

StateObject在这种情况下请改用

struct LocationView: View {

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

SwiftUI 1

LocationViewModel在这里实际上是多余的。由于您LocationManagerObservableObject您,因此可以在视图中直接使用它,如下所示:

struct LocationView: View {

    @ObservedObject var locationManager: LocationManager = LocationManager()

    var body: some View {
        VStack(alignment: .leading) {
            Text("Latitude: \(locationManager.location.coordinate.latitude.description)")
            Text("Longitude: \(locationManager.location.coordinate.longitude.description)")
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正确使用MVVM模式

来自分类Dev

使用MVVM处理UIElement

来自分类Dev

SwiftUI MVVM模式是否正确应用?

来自分类Dev

MVVM模式和Storyboard iOS

来自分类Dev

当我使用MVVM模式和MVVM Light单击后退按钮时,如何返回预览页面?

来自分类Dev

使用MVVM处理用户设置

来自分类Dev

在模型和控制器中使用CoreLocation的最佳实践

来自分类Dev

正确的MVVM设计模式-ViewModel和DataContext

来自分类Dev

正确的MVVM ViewModel和模型模式

来自分类Dev

wpf 和 mvvm 模式中的控制

来自分类Dev

python模式匹配和处理

来自分类Dev

如何使用WPF和MVVM模式从窗口获取数据到另一个

来自分类Dev

在WPF中使用棱镜和MVVM模式创建模态对话框的“漂亮”方法

来自分类Dev

使用Caliburn.Micro MVVM框架和IoC容器的引导程序设计模式

来自分类Dev

在WPF中使用棱镜和MVVM模式创建模态对话框的“漂亮”方法

来自分类Dev

使用C编写Shell。如何区分交互模式和批处理模式

来自分类Dev

使用C编写Shell。如何区分交互模式和批处理模式

来自分类Dev

是否可以在MVVM模式中使用WindowsFormsHost?

来自分类Dev

WPF:如何正确使用MVVM模式

来自分类Dev

如何使用MVVM模式绑定Datagrid?

来自分类Dev

使用模式比较工具处理模式重构

来自分类Dev

如何快速使用CoreLocation?

来自分类Dev

无法在SwiftUI中使用ForEach和CoreData将数据正确传递到模式表示

来自分类Dev

使用MVVM处理HTTP GET请求

来自分类Dev

正确使用MVVM和命令

来自分类Dev

如何在WPF中使用MVVM设计模式以编程方式选择和设置数据网格行的焦点

来自分类Dev

使用批处理文件从变量中删除部分字符串,包括模式和模式之后

来自分类Dev

使用iosMath和SwiftUI

来自分类Dev

SwiftUI和完成处理程序有问题

Related 相关文章

  1. 1

    正确使用MVVM模式

  2. 2

    使用MVVM处理UIElement

  3. 3

    SwiftUI MVVM模式是否正确应用?

  4. 4

    MVVM模式和Storyboard iOS

  5. 5

    当我使用MVVM模式和MVVM Light单击后退按钮时,如何返回预览页面?

  6. 6

    使用MVVM处理用户设置

  7. 7

    在模型和控制器中使用CoreLocation的最佳实践

  8. 8

    正确的MVVM设计模式-ViewModel和DataContext

  9. 9

    正确的MVVM ViewModel和模型模式

  10. 10

    wpf 和 mvvm 模式中的控制

  11. 11

    python模式匹配和处理

  12. 12

    如何使用WPF和MVVM模式从窗口获取数据到另一个

  13. 13

    在WPF中使用棱镜和MVVM模式创建模态对话框的“漂亮”方法

  14. 14

    使用Caliburn.Micro MVVM框架和IoC容器的引导程序设计模式

  15. 15

    在WPF中使用棱镜和MVVM模式创建模态对话框的“漂亮”方法

  16. 16

    使用C编写Shell。如何区分交互模式和批处理模式

  17. 17

    使用C编写Shell。如何区分交互模式和批处理模式

  18. 18

    是否可以在MVVM模式中使用WindowsFormsHost?

  19. 19

    WPF:如何正确使用MVVM模式

  20. 20

    如何使用MVVM模式绑定Datagrid?

  21. 21

    使用模式比较工具处理模式重构

  22. 22

    如何快速使用CoreLocation?

  23. 23

    无法在SwiftUI中使用ForEach和CoreData将数据正确传递到模式表示

  24. 24

    使用MVVM处理HTTP GET请求

  25. 25

    正确使用MVVM和命令

  26. 26

    如何在WPF中使用MVVM设计模式以编程方式选择和设置数据网格行的焦点

  27. 27

    使用批处理文件从变量中删除部分字符串,包括模式和模式之后

  28. 28

    使用iosMath和SwiftUI

  29. 29

    SwiftUI和完成处理程序有问题

热门标签

归档