iOS:在 SwiftUI 列表中显示 IBeacon 信息出错 "Value of type 'NSObject' has no member"

iOS: Display IBeacon information in a SwiftUI List gives error "Value of type 'NSObject' has no member"

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

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

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

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。来自这个数组的数据是我将在视图中使用的数据。

现在说说让我很困惑的部分。

在我看来,如果 print 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。这应该会导致不同的编译错误,但我怀疑这仍然会解决它。

此外,您可能想对 List id 参数使用 .uuid

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