vendredi 4 juin 2021

SwiftUI Button if Statement

I have the following problem:

I built an app that has 6 buttons and each of these buttons is assigned a CL region. I have a GPS track file that provides the app with locations and simulates a walk.

Now buttons should turn yellow when the region assigned to them is reached. It works so far, but the problem is that I don't know where to ask whether or not to reach the Region of Button. I tried .onAppear () {if ...}, but that is only triggered once and I need something that monitors the If statement all the time.

Is there anything?

Thanks in advance

here my code:

import MapKit
import SwiftUI
import CoreLocation
var region1 = CLCircularRegion(center:CLLocationCoordinate2D(latitude: 52.505088, longitude: 13.333574), radius: 20, identifier: "region1")
var region2 = CLCircularRegion(center:CLLocationCoordinate2D(latitude: 52.504829, longitude: 13.336798), radius: 20, identifier: "region2")
var region3 = CLCircularRegion(center:CLLocationCoordinate2D(latitude: 52.504733, longitude: 13.341834), radius: 20, identifier: "region3")
var region4 = CLCircularRegion(center:CLLocationCoordinate2D(latitude: 52.503312, longitude: 13.347718), radius: 20, identifier: "region4")
var region5 = CLCircularRegion(center:CLLocationCoordinate2D(latitude: 52.505699, longitude: 13.352198), radius: 20, identifier: "region5")
var region6 = CLCircularRegion(center:CLLocationCoordinate2D(latitude: 52.513517, longitude: 13.350253), radius: 20, identifier: "region6")


class LocationEnviroment: NSObject, CLLocationManagerDelegate, ObservableObject{
    var locationManager = CLLocationManager()
    @Published var currentPosition = ""
    
    var Waypoints = [region1, region2, region3, region4, region5, region6];
    @Published var RegionIndex: Int = 6

    func initPositionService(){
        
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()
        locationManager.requestWhenInUseAuthorization()
        locationManager.delegate = self
        locationManager.startUpdatingLocation()
    }
    
    func isWayPoint(mylocation : CLLocation) -> Int{
        
        for i in self.Waypoints{
            
            if(i == mylocation){
                
                if(i.identifier == "region1"){
                    return 0
                }else if(i.identifier == "region2"){
                    return 1
                }else if(i.identifier == "region3"){
                    return 2
                }else if(i.identifier == "region4"){
                    return 3
                }else if(i.identifier == "region5"){
                    return 4
                }else if(i.identifier == "region6"){
                    return 5
                }
            }
        }
        return 6 // <- nothing found
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let myLocation = locations.last
        let lat = myLocation?.coordinate.latitude
        let lon = myLocation?.coordinate.longitude
        self.currentPosition = "lat: \(lat ?? 0) lon: \(lon ?? 0)"
        self.RegionIndex = isWayPoint(mylocation: myLocation!)
    }
}

    
struct ContentView: View {

    
    @StateObject var locationEnviroment = LocationEnviroment()
   
    var Todo = ["Friseur / Haare schneiden", "Dönerbude / zu Mittag essen", "Bank / Geld abheben", "Supermarkt / einkaufen", "Blumeneladen /\n Blumen kaufen", "       Lisa's Wohnung /\n Lisa Blumen überreichen" ]
    @State private var disabled = Array(repeating: true, count: 6)
    @State private var red = 255.0
    @State private var blue = 0.0
    @State private var green = 0.0
    var body: some View {
        
        
       
        VStack(alignment: .center, spacing: 10){
            Text(locationEnviroment.currentPosition)
                .padding()
            ForEach(0..<6) { row in
                
                Button(action : {
                    if(disabled[row] == false){
                        red = 0.0
                        green = 255.0
                        blue = 0.0
                    }
                }) {
                    
                    Text(Todo[row])
                        .frame(width : 200, height: 40, alignment: .center)
                        .clipShape(Rectangle())
                        .padding()
                        .border(Color.black, width: 1)
                        .font(.system(size: 15))
                        .foregroundColor(.black)
                        
                }
                .background(Color(red: red/255, green: green/255, blue: blue/255))
                .lineLimit(nil)
                .cornerRadius(8.0)
                .disabled(disabled[row])
                .onAppear(){
                    if(locationEnviroment.RegionIndex == row){
                        disabled[row] = false
                        red = 255.0
                        green = 255.0
                        blue = 0.0
                    
                    }
                }
            }
        }
        .onAppear(){
            locationEnviroment.initPositionService()
        }
    }
}

Aucun commentaire:

Enregistrer un commentaire