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)
}
}
}
我正在尝试在 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)
}
}
}