2017-12-18 109 views
0

我想從我的一個視圖控制器讀取一個字節數組到另一個,請在下面找到我的代碼。如何在swift中正確讀取外設值?

從我的第一個視圖

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) 
       } 

這是我的,我試圖來讀取首先我陣列的第二視圖查看

class Second: UIViewController { 

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

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

print(myByteArray2) 
} 

現在我有[11,12,13,14,15,16,17,18,19,20]從myByteArray 但myByteArray2中有[0,0,0,0,0,0,0,0,0,0,0,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) 
    } 

現在在我的第一個下準備賽格瑞塊我傳遞周圍像這樣

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if segue.destination is Second 
{ 
let vc2 = segue.destination as? Second 
vc2.periperal = blePeripheral 
} 
} 
+0

你是如何轉換視圖控制器?首先呼叫第二? – Diesel

+0

@柴油嗨柴油,非常感謝,我能夠解決它與您的答案一點點閱讀:) – nar0909

+0

沒問題。你在做什麼是正確的!我建議閱讀Apple教程(只需閱讀它),因爲它可以節省您的時間並涵蓋基本知識。 https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/是一個很好的開始或免費的書籍,如果你有更多的時間在名爲「應用程序開發與斯威夫特」的書店。 – Diesel

回答

0

您正在從喲創建新的First視圖控制器而不是訪問已經創建的視圖控制器。

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

所以你有兩個First現在是。你想要做的是訪問已經創建的First視圖控制器。假設沒有其他辦法,你想擁有一個「Singleton」。這是一個非常糟糕的方式來處理這個問題,稍後我會解釋,而且很可能有更好的方法,但是如果他們從不溝通,我會給出一個解決方案來訪問First from Second,但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概念。因此,如果您無法將正確的數據傳遞給第二個,那麼您可能需要一個新的類來處理您的數據,First和Second都可以使用MVC中的Model。

+0

嗨感謝您的回覆,https://stackoverflow.com/questions/47824265/how-to-modify-an-existing-blecentral-class-into-a-singleton-class這正是我所擁有的,所以你可以現在就幫助我解決它是如何完成的?我不希望它是單身人士,我可以在一個視圖控制器中讀寫,我只想將相同的功能傳遞給我的其他視圖?任何幫助讚賞。 – nar0909

+0

請檢查我的編輯,瞭解如何通過外設。很多謝謝 – nar0909

+0

我很高興你解決了這個問題。意識到,如果你有很多數據,你可以創建一個全新的類來處理這些數據。例如,我有一個包含多個食物的應用程序。我的課外出,下載地點,存儲它們,並具有getPlace或getAllPlaces或refreshPlaces等功能。這也是一個單身人士,所以每個人都可以進入這些地方。這樣我就不必每次都需要下載數據。這裏是一個相當不錯的閱讀MVC:https://www.raywenderlich.com/132662/mvc-in-ios-a-modern-approach – Diesel