iOS:在 SwiftUI 列表中显示 IBeacon 信息会给出错误“'NSObject' 类型的值没有成员”

问题描述

我正在尝试在 SwiftUI 中创建一个列表,以显示来自附近信标的信息,但没有进一步成功。

我可以将 CLBeacon 数组信息打印到控制台,但是当我尝试将其打印在列表中时它不起作用。

这是我用来开始测距和监控的完整课程。

class Detector: NSObject,ObservableObject,CLLocationManagerDelegate {
    var locationManager: CLLocationManager?
    @Published var beaconData = [CLBeacon]()
    
    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() {
                    startScanning()
                }
            }
        }
    }
    
    func locationManager(_ manager: CLLocationManager,didRangeBeacons beacons: [CLBeacon],in region: CLBeaconRegion) {
        beaconData = beacons
    }
    
    func startScanning() {
        let uuid = UUID(uuidString: "<uuid>")!
        let constraint = CLBeaconIdentityConstraint(uuid: uuid)
        let beaconRegion = CLBeaconRegion(beaconIdentityConstraint: constraint,identifier: "beacon")

        locationManager?.startMonitoring(for: beaconRegion)
        locationManager?.startRangingBeacons(satisfying: constraint)
    }
    
}

我将信标数据存储到 CLBeacon 数组 beaconData 中。这个数组中的数据是我将在视图中使用的数据。

现在让我感到困惑的部分,很多。

在我看来,如果将 beaconData 打印到控制台,它会起作用。整个对象或只是一个属性都有效。 但是如果我想在应用程序的列表中打印它,它不起作用。例如 UUID,我收到错误 Value of type 'NSObject' has no member 'uuid'

struct PositionOverview: View {
    @StateObject var detector = Detector()
    
    var body: some View {
        // This works
        detector.beaconData.forEach{beacon in
            print(beacon.uuid)
        }
        
        // This does not work
        return List(detector.beaconData,id: \.self){beacon in
            Text(beacon.uuid)
        }
        
    }
}

有谁知道为什么这不起作用?我错过了什么? 有没有读到 CLBeacon 具有 NSObject 的内部属性

解决方法

Text 接受一个 String,而您正试图向它发送一个 UUID。这应该会导致不同的编译错误,但我怀疑这仍然会解决它。

此外,您可能希望将 .uuid 用于 List id 参数:

struct PositionOverview: View {
    @StateObject var detector = Detector()
    
    var body: some View {
        List(detector.beaconData,id: \.uuid) { beacon in
            Text(beacon.uuid.uuidString)
        }
    }
}