TL;DR
J'ai créé un échantillon de délégué à l'aide du SDK, etc. écrit en Objective-C en référence à CoreLocation. Cliquez ici pour la source> https://github.com/dropcontrol/LocationUpdata
J'utilise également @ ObservableObject
et @ ObserbedObject
au lieu de @ State
comme méthode utilisant Property Wrapper de SwiftUI. En fait, «@ State» suffit car il s'agit d'un changement de propriété dans une seule vue. Lorsque vous utilisez @ ObservableObject
, cela signifie qu'il est nécessaire de changer la propriété sur plusieurs vues.
référence:
https://rusutikaa.github.io/docs/developer.apple.com/documentation/swiftui/managing-model-data-in-your-app.html
https://capibara1969.com/2508/
L'application elle-même est une application à fonction unique qui utilise MapKit pour obtenir la latitude et la longitude et l'afficher. Et, la partie pour obtenir la latitude et la longitude est effectuée par func locationManager (_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
, qui est défini dans CLLocationManagerDelegate. Alors, comment écrivez-vous délégué?
struct ContentView: View {
@ObservedObject var placeInfo = PlaceInfo()
var manager = CLLocationManager()
var managerDelegate = locationDelegate()
var body: some View {
VStack{
HStack {
Text("Latitude:")
Text(placeInfo.latitude)
}
HStack {
Text("longitude:")
Text(placeInfo.longitude)
}
Button(action: {
print("Button Tapped")
placeInfo.latitude = managerDelegate.currentLatitude
placeInfo.longitude = managerDelegate.currentLongitude
}){
Text("Current Location")
}
}
.onAppear() {
manager.delegate = managerDelegate
managerDelegate.locationManagerDidChangeAuthorization(manager)
}
}
}
Comme
var manager
de CLLocationManager ()var managerDelegate
manager.delegate = managerDeleagte
dans .onAppear ()Vous pouvez maintenant accéder à managerDelegate.locationManagerDidChangeAuthorization (manager)
dans le Button et à managerDelegate.locationManagerDidChangeAuthorization (manager)
dans .onAppear ().
Le délégué lui-même est décrit comme suit.
class locationDelegate : NSObject, ObservableObject, CLLocationManagerDelegate {
//Variables à récupérer du délégué
var currentLatitude: String = "none"
var currentLongitude: String = "none"
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
if manager.authorizationStatus == .authorizedWhenInUse {
print("authorized")
manager.startUpdatingLocation()
// add "Privacy - Location Default Accuracy Reduced" in info.plist
// and edit in souce code that value is <true/> or <false/>
if manager.accuracyAuthorization != .fullAccuracy {
print("reduce accuracy")
// add "Privacy - Location Temporary Usage Description Dictionary" in info.plist
// and set "Location" in Key
manager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "Location") {
(err) in
if err != nil {
print(err!)
return
}
}
}
} else {
print("not authorized")
// add "Privacy - Location When In Use Usage Description" in info.plist
manager.requestWhenInUseAuthorization()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
print(String(format: "%+.06f", location.coordinate.latitude))
print(String(format: "%+.06f", location.coordinate.longitude))
currentLatitude = String(format: "%+.06f", location.coordinate.latitude)
currentLongitude = String(format: "%+.06f", location.coordinate.longitude)
}
}
}
Le précédent managerDelegate.locationManagerDidChangeAuthorization (manager)
est une méthode de CoreLocationg qui alerte l'utilisateur pour qu'il autorise les informations de localisation (les informations de localisation ne peuvent être obtenues que si elles y passent). Défini dans func locationManagerDidChangeAuthorization (_ manager: CLLocationManager) {}
. À quel niveau et comment obtenez-vous l'autorisation d'acquérir des informations en définissant dans info.plist? Vous pouvez définir le.
Le func locationManager (_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {}
est utilisé pour mettre à jour les informations de localisation. C'est la fonction de délégué. En fait, cette fonction n'est pas appelée de n'importe où, elle est appelée chaque fois que les informations de localisation sont mises à jour.
@ ObservableObject
et @ ObserbedObject
Comme je l'ai brièvement écrit, il est parfaitement bien d'écrire Property Wrapper avec @ State
dans cette application (je l'ai également commenté dans la source), mais avec @ ObservableObject
, c'est@Publised. En attachant
à une variable, la mise à jour est automatiquement reflétée, la variable est partagée entre plusieurs vues et elle est appliquée en un seul endroit.
@ ObservableObject
est défini comme une classe comme suit.
class PlaceInfo: ObservableObject {
@Published var latitude: String = "none"
@Published var longitude: String = "none"
}
Si vous tapez par erreur @ ObservedObject
dans le stockage automatique ici, une erreur se produira (évidemment, cela a tendance à être fait).
Lors de l'utilisation ...
@ObservedObject var placeInfo = PlaceInfo() //Ceci est observé.
Vous pouvez appeler et réécrire des variables en instanciant avec et en faisant quelque chose comme placeInfo.latitude
. Personnellement, je pense que c'est plus facile à écrire que d'écrire avec «@ State». Cela ne semble pas problématique à utiliser dans une seule vue, mais si vous souhaitez gérer la portée des variables, c'est une bonne idée de les utiliser correctement.
Recommended Posts