我正在嘗試建立一個 MVVM 模式來將值從 BLEManager 獲取到 ViewModel,然后再到我的視圖。但不知何故,我無法將 BLEManager 類中的值發送到 View Model。以下是我的資料流:
視圖(包含一些內容的主視圖)<- 視圖(一個帶有串列的內容)<- ViewModel(將資料作為陣列提供給視圖串列的視圖模型)<- BleManager(用于獲取可用 ble 設備的 ble 掃描儀)
管理器:
class BLEManager: NSObject, ObservableObject {
var centralManager: CBCentralManager!
@Published var peripherals = [CBPeripheral]()
@Published var isSwitchedOn = false
override init() {
super.init()
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func startScanning() {
centralManager.scanForPeripherals(withServices: nil, options: nil)
}
func stopScanning() {
centralManager.stopScan()
}
}
extension BLEManager: CBCentralManagerDelegate, CBPeripheralDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
isSwitchedOn = true
}
else {
isSwitchedOn = false
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
guard let peripheralName = advertisementData[CBAdvertisementDataLocalNameKey] as? String else {
return
}
if !peripherals.contains(where: { $0.name == peripheralName }), let name = peripheral.name {
peripherals.append(peripheral)
}
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
print("didFailToConnect")
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
print("didDisconnectPeripheral")
}
}
我無法弄清楚如何撰寫我的視圖模型以下是它的當前狀態:ViewModel:
class NearbyBLEListViewModel: ObservableObject {
@Published var authenticationResult: Bool?
@Published var bleDevices = [BLEInfo]()
@Published var blutoothOff: Bool?
var bleManager = BLEManager()
func startScanning() {
bleManager.startScanning()
bleDevices = bleManager.peripherals.map { BLEInfo(bleId: $0.name ?? "NA", hash: "") }
// if bleManager.isSwitchedOn {
// blutoothOff = false
// bleDevices = bleManager.peripherals.map { bleInfo(bleId: $0.name ?? "NA", hash: "") }
// print(bleDevices)
// } else {
// blutoothOff = true
// }
}
func getBLEDevices() {
bleDevices = bleManager.peripherals.map { BLEInfo(bleId: $0.name ?? "NA", hash: "") }
print(bleDevices)
}
}
在視圖中使用它如下:
struct NearbyBLEListView: View {
@ObservedObject var bleManager = BLEManager()
@StateObject private var viewModel = NearbyBLEListViewModel()
var body: some View {
VStack {
Text("BLEs nearby:")
.font(.system(size: 22, weight: .bold, design: .default))
.padding()
.foregroundColor(.black)
List(viewModel.bleDevices) { ble in
HStack {
Text(ble.bleId)
}
}
.navigationTitle("News")
.onAppear(perform: viewModel.startScanning)
}
}
}
最后是我最重要的觀點:
var body: some View {
NavigationView {
VStack(alignment: .center) {
buttonView
NearbyBLEListView()
}
.navigationTitle("")
.toolbar {
moreButtonView
}
}
}
我剛剛開始使用 SwiftUI,所以我可能偏離了 SwiftUI 的最佳實踐。有人可以在這里幫助我嗎?
uj5u.com熱心網友回復:
擺脫視圖模型物件,我們在 SwiftUI 中不使用 MVVM。View 資料結構已經是螢屏上實際視圖的模型,例如 SwiftUI 為我們更新的 UILabels、UITables 等。我們可以將相關的變數和邏輯移動到自定義@State結構中,以使代碼更具可測驗性,但是在您的情況下,它看起來像這樣:
struct NearbyBLEListView: View {
@StateObject var bleManager = BLEManager()
var body: some View {
VStack {
Text("BLEs nearby:")
.font(.system(size: 22, weight: .bold, design: .default))
.padding()
.foregroundColor(.black)
List(bleManager.bleDevices) { ble in
HStack {
Text(ble.bleId)
}
}
.navigationTitle("News")
}
}
}
@StateObjectBLEManager當視圖出現時 s 是 init ,因此您可以在's init內部開始掃描。您還需要 BLEManager 來保存您BLEDevice的結構陣列,例如
class BLEManager: NSObject, ObservableObject {
@Published var bleDevices = [BleDevice]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/436442.html
