J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit

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/

Comment écrire un délégué?

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

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.

Comment écrire

@ 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

J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit
J'ai essayé de créer un exemple de programme en utilisant le problème du spécialiste des bases de données dans la conception pilotée par domaine
Déléguez le motif entre les vues. J'ai également fait une transition de page d'exemple en utilisant NavigationLink.
Comment écrire une recherche de comparaison de dates dans Rails
Comment écrire un mod de base dans Minecraft Forge 1.15.2
Je veux trouver un chemin relatif dans une situation où Path est utilisé
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
J'ai créé un client RESAS-API en Java
J'ai créé un système d'exemple MVC simple à l'aide de Spring Boot
J'ai créé un Dockerfile pour démarrer Glassfish 5 en utilisant Oracle Java
[Java] Je souhaite écrire un traitement asynchrone à l'aide de Promise dans Java-Trial of Promise-like syntax of JavaScript-
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
J'ai fait un petit bijou pour poster le texte du mode org sur qiita
Comment afficher une liste de chaînes dans JSF sous forme de chaînes séparées par des virgules
J'ai créé un outil pour afficher la différence du fichier CSV
Comment exécuter un contrat avec web3j
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
Comment trier une liste à l'aide du comparateur
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Je veux écrire un joli build.gradle
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
Comment créer une requête à l'aide de variables dans GraphQL [Utilisation de Ruby on Rails]
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment insérer une vidéo dans Rails
Résumé de l'écriture des arguments d'annotation
[Introduction à Java] Comment écrire un programme Java
Je veux écrire un test unitaire!
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Comment publier une bibliothèque dans jCenter
[SpringBoot] Comment écrire un test de contrôleur
[Note] [Débutant] Comment écrire lors de la modification de la valeur d'un élément de tableau dans une phrase répétée de Ruby
Création d'un exemple de programme en utilisant le problème d'un spécialiste des bases de données dans DDD Improvement 2
Bases du développement Java ~ Comment écrire un programme (flux et branchement conditionnel) ~
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Création d'un exemple de programme en utilisant le problème d'un spécialiste des bases de données avec DDD Improvement 1
Comment créer une combinaison unique de données dans la table intermédiaire des rails
J'ai créé un programme de jugement des nombres premiers en Java
Promesse JDBC et exemple d'écriture
Rails: comment bien écrire une tâche de râteau
[Java FX] Comment écrire des autorisations Eclipse dans build.gradle
[Rails] Comment écrire lors de la création d'une sous-requête
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment afficher une page Web en Java
Comment supprimer un contrôleur, etc. à l'aide d'une commande
Écrire dans un fichier en utilisant ShiftJIS ・ Lire un fichier (Kotlin / JVM)
[Ethereum] Comment exécuter un contrat en utilisant web3j-Part 2-
Je veux écrire une simple répétition d'une chaîne de caractères
Comment exécuter une tâche djUnit dans Ant
J'ai créé un jeu Janken en Java (CLI)
J'ai créé un conteneur Docker pour exécuter Maven
J'ai créé une bibliothèque d'extension Ruby en C
Comment ajouter un chemin de classe dans Spring Boot
Comment créer un thème dans Liferay 7 / DXP