Я пишу приложение с обнаружением 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)
}
}