SwiftUI Как передать переменную из UIView в класс - PullRequest
0 голосов
/ 26 марта 2020

Я пишу приложение с обнаружением iBeacon. Я извлекаю данные из API и перечисляю их в представление A, а затем навигатор для детального просмотра данных. В подробном представлении есть класс обнаружения маяка. Проблема в том, что я не могу передать устройство UUID в класс. Кажется, что данные передаются только в подробный вид, но не в класс. Есть ли способ позволить мне перейти к UUID к классу и заменить на func startDect()?

Представление A

import SwiftUI

struct ScheduleView: View {

    @EnvironmentObject var settings : LoginAuth
    @ObservedObject private var scheduleListVM = scheduleservices()

    var body: some View {
         ZStack {
         ForEach(self.scheduleListVM.schedulelist, id: \.SNO) { schedule in
             NavigationLink(destination: EnrollmentView(schedule:schedule)) {

 CourseID: "\(schedule.CourseName)", CourseName:"", Date:"\

(schedule.Date)", StartTime: "Tutor:  \(schedule.StartTime)", EndTime: "Year:   \

(schedule.EndTime)", LocID: "", Room: "", Floor: "", Region: ""
    }
}

Подробное представление с классом

import Combine
import CoreLocation
import SwiftUI

class BeaconDector: NSObject, ObservableObject, CLLocationManagerDelegate {

    var objectWillChange = ObservableObjectPublisher()
    var LocationManager : CLLocationManager?
    var LastDistance = CLProximity.unknown

    override init(){
        super.init()

        LocationManager = CLLocationManager()
        LocationManager?.delegate = self
        LocationManager?.requestWhenInUseAuthorization()
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus ){
        if status == .authorizedWhenInUse {
            if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self){
                if CLLocationManager.isRangingAvailable(){
                    startDect()
                }
            }
        }
    }

    func startDect(){
        let uuid = UUID(uuidString:"5A4BCFCE-174E-4BAC-A814-092E77F6B7E5")!
        let cons = CLBeaconIdentityConstraint( uuid: uuid, major: 123, minor: 456)
        let beaconRegion = CLBeaconRegion(beaconIdentityConstraint: cons, identifier: "Test")
        LocationManager?.startMonitoring(for: beaconRegion)
        LocationManager?.startRangingBeacons(satisfying: cons)
    }

    func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
        if let beacon = beacons.first{
            update(distance: beacon.proximity)
        } else {
            update(distance: .unknown)
        }
    }

    func update( distance : CLProximity) {
        LastDistance = distance
        objectWillChange.send()
    }
}


struct EnrollmentView: View {
    let schedule: schedule
    @ObservedObject var scanner = BeaconDector()

    var body: some View {
         Text(schedule.UUID)
    }
}
...