问题描述
我正在尝试在 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)
}
}
}