如何在swift中正确读取外设值?

问题描述 投票:0回答:1

我试图从我的一个视图控制器读取一个字节数组到另一个,请在下面找到我的代码。

从我的第一个视图

class First: UIViewController {

var myByteArray = [UInt8](repeating:0, count: 20)

viewDidLoad(){
......}

之后很少有陈述,我在函数中读取数据

func passThis(){

let ReceiveData = rxCharacteristic?.value
        if let ReceiveData = ReceiveData {
            let ReceivedNoOfBytes = ReceiveData.count
            myByteArray = [UInt8](repeating: 0, count: ReceivedNoOfBytes)
            (ReceiveData as NSData).getBytes(&myByteArray, length: ReceivedNoOfBytes)
            print("Data Received ",myByteArray)
               }

这是我的第二个视图,我正在尝试从First View读取我的数组

class Second: UIViewController {

var myByteArray2 = [UInt8](repeating: 0, count: 20)

viewDidLoad(){
super.viewDidLoad()
let fvc = First()
myByteArray2 = fvc.myByteArray

print(myByteArray2)
}

现在我有来自myByteArray的[11,12,13,14,15,16,17,18,19,20]但有[0,0,0,0,0,0,0,0,0,0,0]来自myByteArray2的,0,0,0,0,0,0,0,0,0]?

有人可以帮忙吗?

另外,在写入和读取新值之前,如何清除rxCharacterstic中的readValue缓冲区?

任何帮助/评论赞赏。

谢谢

编辑 - >我的传球如何完成

来自BLECentral

class BLECentral: ...

var centralManager: CBCentralManager!

//After Scanning and connecting

func centralManager(_central: CBCentralManager, didConnect peripheral: CBPeripheral){

peripheral.delegate = self

peripheral.discoverServices([BLEUUID])



//Once connected, move to new view controller to manager incoming and outgoing data
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let firstVC = storyboard.instantiateViewController(withIdentifier: "First") as! First

        firstVC.peripheral = peripheral

        navigationController?.pushViewController(firstVC, animated: true)
    }

现在我的第一个准备segue块我正在通过这样的外围设备

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
 if segue.destination is Second
{
let vc2 = segue.destination as? Second
vc2.periperal = blePeripheral
}
}
ios arrays swift
1个回答
0
投票

您正在从First视图控制器创建新的Second视图控制器,而不是访问已创建的控制器。

//Create a new View Controller
let fvc = First()

所以你现在有两个First。您要做的是访问已创建的First视图控制器。假设没有别的办法,你想拥有一个“单身人士”。这是处理这种情况的一种非常糟糕的方式,正如我稍后将解释的那样,并且最有可能是一种更好的方法,但是我将提供一个解决方案,如果他们从不通信,则从第二个访问First,但是First已经创建了。

如果你在First中声明一段代码,例如:

static let shared = First()

然后可以通过访问该单例

let first = First.shared

话虽这么说,这是处理视图控制器之间通信的一种非常糟糕的方式。如果你从First调用Second,你应该将数据从First传递给Second(或者你可以传递First to Second的引用,以便Second可以访问First)。

通常有很好的方法在视图控制器之间传递数据

func prepare(for segue: UIStoryboardSegue, sender: Any?) 

导航前的方法。无论何时,无论如何,使第二视图控制器应该传递它所需的数据。

最后,Singleton视图控制器的一个可怕想法的另一个原因是它远离了MVC概念。因此,如果您无法将正确的数据传递给Second,您可能需要一个新的类来处理您的数据,First和Second都可以使用哪个是MVC中的Model。

© www.soinside.com 2019 - 2024. All rights reserved.