• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

Gereiste Distanz - Zurücksetzen

Thaddäus

Golden Noble
Registriert
27.03.08
Beiträge
18.393
Hallo Zusammen

Ich stehe grad auf dem Schlauch. Ich habe folgenden Code, um die zurückgelegte Distanz zu berechnen und anzuzeigen:

Swift:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            
            // Track Distance
        
            if startDate == nil {
                startDate = Date()
            } else {
                print("elapsedTime:", String(format: "%.0fs", Date().timeIntervalSince(startDate)))
            }
            if startLocation == nil {
                startLocation = locations.first
            } else if let location = locations.last {
                traveledDistance += lastLocation.distance(from: location)
                print("Traveled Distance:",  traveledDistance)
                print("Straight Distance:", startLocation.distance(from: locations.last!))
            }
            lastLocation = locations.last
        
            //Track Route
        
            for location in locations {
            
                coordinates.append (location.coordinate)
            
                let numberOfLocations = coordinates.count
                print (" :-) \(numberOfLocations)")
            
            if numberOfLocations > 5{
                var pointsToConnect = [coordinates[numberOfLocations - 1], coordinates[numberOfLocations - 2]]
                
                let polyline = MKPolyline(coordinates: &pointsToConnect, count: pointsToConnect.count)
                
                mapView.addOverlay(polyline)
            }
        }
    }

Das funktioniert soweit ganz gut, die Distanz wird korrekt angezeigt. Hier kommt nun aber mein Problem:

1. Ich beende das Tracking in dem ich den Stop Button drücke. Da habe ich sagen wir 200m zurückgelegt.
2. Ich laufe einfach noch 2 Kilometer ohne aktives Tracking.
3. Ich starte das Tracking neu, nun wird mir aber 2,2 Kilometer als zurückgelegtte Distanz angezeigt.

Was ich erreichen möchte:

1. Beim drücken des Stop Buttons, soll die gesamte zurückgelegte Distanz auf Null gesetztt werden, und ab erneutem drücken auch wieder bei 0 angefangen werden. Hier ist noch mein Code für den Stop Button:

Swift:
    @IBAction func stopButtonPressed(_ sender: Any) {
        
        TopNotchView.topNotchViewfadeOut(duration: 1.0)
        timeElapsed.fadeOut(duration: 1.0)
        distanceDriven.fadeOut(duration: 1.0)
        
        stopwatchPauseButton.fadeOut(duration: 0.5)
        stopwatchResetButton.fadeOut(duration: 0.5)
        
        startButton.ButtonViewfadeOut(duration: 0.5)
        startButton.setImage(UIImage(named: "GreenButtonHighRes.png"), for: .normal)
        startButton.ButtonViewfadeIn(duration: 0.5)
        
        // Testing disabling the screen sleep mode while recording a ride (Reenabling sleep when stop is pressed)
        
        UIApplication.shared.isIdleTimerDisabled = false
        
        locationManager.stopUpdatingLocation()
        locationManager.stopMonitoringSignificantLocationChanges()
        
        timer.invalidate()
        (hours, minutes, seconds, fractions) = (0, 0, 0, 0)
        timeElapsed.fadeOut(duration: 1.0)
        timeElapsed.text = "00:00:00"
        distanceDriven.text = "00.00 Km"
        timeElapsed.textColor = UIColor.init(red: 156/255, green: 199/255, blue: 105/255, alpha: 1.0)
        startButton.isEnabled = true
        
        distanceDriven.fadeOut(duration: 1.0)
        distanceDriven.textColor = UIColor.init(red: 156/255, green: 199/255, blue: 105/255, alpha: 1.0)
        distanceDriven.fadeIn(duration: 1.0)
        
        stopwatchPauseButton.isEnabled = true
        timeElapsed.fadeIn(duration: 1.0)
        stopwatchResetButton.isEnabled = false
        stopwatchPauseButton.isEnabled = false
        
        // Reset traveled distance to 0 and apply on Label
        
        self.mapView.removeOverlays(self.mapView.overlays)
        
        coordinates.removeAll()
        
        traveledDistance -= traveledDistance
        distanceDriven.text = "0 m"
    }

Könnte mir eventuell jemand erklären, wie ich das bewerkstelligen kann?

Viele Grüsse,

Stephan
 

Thaddäus

Golden Noble
Registriert
27.03.08
Beiträge
18.393
Ich erlaube mir, das hier nochmal hochzuholen. Hat niemand eine Idee?

Viele Grüsse,

Stephan
 

Sequoia

Swiss flyer
Registriert
03.12.08
Beiträge
17.040
Ich muss gestehen, dass ich das zwar gelesen hatte, aber keine Ahnung habe, worum es geht, welches Script was wie irgendwo auslesen und zurücksetzen soll, wo es nachher dann angezeigt wird, usw.

Vielleicht geht das Anderen auch so, was den Mangel an Meldungen zur Folge hat?
 

Thaddäus

Golden Noble
Registriert
27.03.08
Beiträge
18.393
Also:

Bei drücken des Start Buttons wird die zurückgelegte Route sowie die zurückgelegte Distanz bis zum drücken des Stop Buttons ermittelt. Die zurückgelegte Distanz wird in einem Label angezeigt, die Route wird als Polyline auf die Karte gezeichnet.

Ziel ist es nun, dass beim drücken des Stop Buttons die zurückgelegte Distanz auf 0 gesetzt wird. Dies damit beim erneuten drücken des Startbuttons die vorherige zurückgelegte Distanz nicht mit einberechnet wird.
 

Sequoia

Swiss flyer
Registriert
03.12.08
Beiträge
17.040
Wo denn?
Und wie? Vielleicht ist das nur mir nicht klar, aber ich weiß überhaupt nicht, wo du was machst und drückst und wo dann was angezeigt wird.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
In deinen Methoden locationManager(_:didUpdateLocations: ) und stopButtonPressed(_: ) greifst du auf die Variable traveledDistance zu. Frage: handelt es sich um die selbe Variable, also eine in der selben Instanz?
Dann frage ich mich, warum du das so kompliziert „auf 0“ setzt und nicht einfach traveledDistance = 0 schreibst.

Du kannst auch alternativ in der Methode locationManager(_:didUpdateLocations: ), dort wo du die startLocation setzt, auch die traveledDistance auf 0 setzen.
 

Thaddäus

Golden Noble
Registriert
27.03.08
Beiträge
18.393
Das habe ich versucht, hat aber nicht funktioniert.

Die Lösung war folgende: In der Action für meinen Stop Button habe ich folgenden Parameter gesetzt:

Swift:
startLocation = nil

Nun wird die Distanz in meinem Szenario korrekt berechnet.

Vielen Dank für eure Hilfe.