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/
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
var manager
von CLLocationManager ()var managerDelegate
manager.delegate = managerDeleagte
in .onAppear ()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.
@ 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.