Ich habe ein Beispiel erstellt, wie ein Delegat in Swift UI 2.0 mit MapKit geschrieben wird

TL;DR Ich habe ein Beispiel für einen Delegierten mit SDK usw. erstellt, das in Objective-C unter Bezugnahme auf CoreLocation geschrieben wurde. Klicken Sie hier für die Quelle> https://github.com/dropcontrol/LocationUpdata Ich verwende auch "@ ObservableObject" und "@ ObserbedObject" anstelle von "@ State" als Methode mit dem Property Wrapper von SwiftUI. Tatsächlich reicht "@ State" aus, da es sich um eine Eigenschaftsänderung in einer einzelnen Ansicht handelt. Bei Verwendung von "@ ObservableObject" bedeutet dies, dass die Eigenschaft in mehreren Ansichten geändert werden muss. Referenz: https://rusutikaa.github.io/docs/developer.apple.com/documentation/swiftui/managing-model-data-in-your-app.html https://capibara1969.com/2508/

Wie schreibe ich einen Delegierten?

Die App selbst ist eine App mit nur einer Funktion, die MapKit verwendet, um den Längen- und Breitengrad abzurufen und anzuzeigen. Der Teil zum Abrufen des Längen- und Breitengrads wird von func locationManager (_ manager: CLLocationManager, didUpdateLocations location: [CLLocation]) { ausgeführt, der in CLLocationManagerDelegate definiert ist. Wie schreibt man einen Delegierten?

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)

        }
    }
}

Wie

Sie können jetzt auf die Datei "managerDelegate.locationManagerDidChangeAuthorization (manager)" innerhalb der Schaltfläche und auf "managerDelegate.locationManagerDidChangeAuthorization (manager)" in .onAppear () zugreifen.

Der Delegierte selbst wird wie folgt beschrieben.

class locationDelegate : NSObject, ObservableObject, CLLocationManagerDelegate {
    
    //Vom Delegaten abzurufende Variablen
    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)
            
        }
    }
}

Das obige "managerDelegate.locationManagerDidChangeAuthorization (manager)" ist eine Methode von CoreLocationg, die den Benutzer auffordert, die Standortinformationen zu lizenzieren (die Standortinformationen können nur abgerufen werden, wenn sie dort übergeben werden). Definiert in func locationManagerDidChangeAuthorization (_ manager: CLLocationManager) {}. Auf welcher Ebene und wie erhalten Sie die Berechtigung zum Abrufen von Informationen, indem Sie in info.plist festlegen? Sie können die einstellen.

Der folgende func locationManager (_ manager: CLLocationManager, didUpdateLocations-Speicherorte: [CLLocation]) {} wird zum Aktualisieren der Standortinformationen verwendet. Dies ist die Funktion des Delegierten. Tatsächlich wird diese Funktion nicht von irgendwoher aufgerufen, sondern jedes Mal, wenn die Standortinformationen aktualisiert werden.

@ ObservableObject und @ ObserbedObject

Wie ich kurz geschrieben habe, ist es vollkommen in Ordnung, Property Wrapper mit "@ State" in dieser App zu schreiben (es wird auch in der Quelle auskommentiert), aber mit "@ ObservableObject" ist es "@Publised" Durch das Anhängen von `an eine Variable wird das Update automatisch wiedergegeben, die Variable wird von mehreren Ansichten gemeinsam genutzt und an einer Stelle angewendet.

Wie schreibt man

@ ObservableObject wird wie folgt als Klasse definiert.

class PlaceInfo: ObservableObject {
    @Published var latitude: String = "none"
    @Published var longitude: String = "none"
}

Wenn Sie hier fälschlicherweise "@ ObservedObject" in den automatischen Speicher eingeben, tritt ein Fehler auf (dies ist offensichtlich in der Regel der Fall).

Beim Benutzen ...

@ObservedObject var placeInfo = PlaceInfo() //Dies wird beobachtet.

Sie können Variablen aufrufen und neu schreiben, indem Sie mit "placeInfo.latitude" instanziieren und dann etwas tun. Persönlich denke ich, dass ich klarer schreiben kann als mit @ State. Es sieht nicht so aus, als wäre es problematisch, es in einer einzelnen Ansicht zu verwenden. Wenn Sie jedoch den Umfang von Variablen verwalten möchten, ist es eine gute Idee, sie ordnungsgemäß zu verwenden.

Recommended Posts

Ich habe ein Beispiel erstellt, wie ein Delegat in Swift UI 2.0 mit MapKit geschrieben wird
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
Muster zwischen Ansichten delegieren. Ich habe auch einen Beispielseitenübergang mit NavigationLink durchgeführt.
So schreiben Sie eine Datumsvergleichssuche in Rails
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe mit Spring Boot ein einfaches MVC-Beispielsystem erstellt
Ich habe eine Docker-Datei erstellt, um Glassfish 5 mit Oracle Java zu starten
[Java] Ich möchte eine asynchrone Verarbeitung mit Promise in der Java-Testversion der Promise-ähnlichen Syntax von JavaScript schreiben.
Ich habe versucht, Code wie eine Typdeklaration in Ruby zu schreiben
Ich habe ein Juwel gemacht, um den Text des Org-Modus in Qiita zu posten
So geben Sie eine Liste von Zeichenfolgen in JSF als durch Kommas getrennte Zeichenfolgen aus
Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben
So führen Sie einen Vertrag mit web3j aus
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
So sortieren Sie eine Liste mit Comparator
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
Ich möchte ein schönes build.gradle schreiben
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie ein Video in Rails ein
Zusammenfassung zum Schreiben von Anmerkungsargumenten
[Einführung in Java] So schreiben Sie ein Java-Programm
Ich möchte einen Unit Test schreiben!
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
So veröffentlichen Sie eine Bibliothek in jCenter
[SpringBoot] So schreiben Sie einen Controller-Test
[Hinweis] [Anfänger] Schreiben, wenn der Wert eines Array-Elements in einem sich wiederholenden Satz von Ruby geändert wird
Erstellen eines Beispielprogramms mit dem Problem eines Datenbankspezialisten für DDD-Verbesserung 2
Grundlagen der Java-Entwicklung ~ So schreiben Sie ein Programm (Ablauf und bedingte Verzweigung) ~
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Erstellen eines Beispielprogramms mit dem Problem eines Datenbankspezialisten mit DDD-Verbesserung 1
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
JDBC Versprechen und Schreibbeispiel
Schienen: Wie man eine Rechenaufgabe schön schreibt
[Java FX] So schreiben Sie Eclipse-Berechtigungen in build.gradle
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So zeigen Sie eine Webseite in Java an
So löschen Sie einen Controller usw. mit einem Befehl
Mit ShiftJIS in Datei schreiben ・ Datei lesen (Kotlin / JVM)
[Ethereum] So führen Sie einen Vertrag mit web3j-Teil 2 aus
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
So führen Sie eine djUnit-Aufgabe in Ant aus
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So erstellen Sie ein Thema in Liferay 7 / DXP