簡體   English   中英

iOS Swift,委托在兩個視圖控制器之間進行通信

[英]IOS Swift, delegate to communicate between two view controllers

我的應用程序有一個主視圖控制器,其中顯示了來自藍牙設備的信息。 要連接到藍牙設備,我選擇連接到另一個視圖控制器以連接到所需的藍牙設備。 然后,我訂閱了該藍牙設備,該藍牙設備每次在藍牙設備發送數據時都會調用一個函數。

選擇了要連接的設備后,我會選擇回到主屏幕,在該屏幕上顯示要接收的數據。 我可以看到,切換回主屏幕並在輔助視圖控制器代碼中打印后,來自藍牙設備接收數據包的事件仍然有效。

我的問題是我想接收在我的第二個視圖控制器中接收到的數據,並在每次接收到它時將其發送到主視圖控制器。 由於我不能跳回第二視圖控制器,因此無法使用segues,因此決定嘗試使用委托進行通信。

到目前為止,這是我在第二個視圖控制器中添加的東西,一個發送數據:

在輔助視圖控制器中,在上課之前:

protocol sendLatLonDelegate : class{
   func sendReceiveData(data:AnyObject?)
}

在我的輔助視圖控制器類的頂部以及其他變量

weak var delegate:sendLatLonDelegate?

在我從藍牙設備收到數據包時調用的函數中

delegate?.sendReceiveData(latFloat)

這是我在主視圖控制器中添加的內容,一個用於接收數據:

將此添加到類定義中

class ViewController: UIViewController,sendLatLonDelegate {

並在我的課堂中添加

 func sendReceiveData(data:AnyObject?) {       
    print("received data")
}

我正在打印接收到的數據值,然后嘗試將其發送到主視圖控制器,並且可以正確看到它。 我沒有看到我收到的數據打印出來。

這可能是一個很小的鏈接,我沒有意識到我在兩者之間缺少了,但是我似乎找不到它。 有人有建議嗎? 非常感謝!

編輯:從答案中的建議,添加

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)
{
    if (segue.identifier == "ConnectDeviceSegue")
    {
        let mapViewController = segue.destinationViewController as!  ViewController
        mapViewController.delegate = self

    }
}

現在收到錯誤“ ViewController”類型的值,在mapViewController.delegate = self行沒有成員“ delegate”

好的,從注釋中我們可以得知您沒有設置delegate屬性,從問題中我們知道您正在使用segues。 為了設置屬性,您需要重寫ViewController一個方法(第一個方法):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "ConnectDeviceSegue") {
        let mapViewController = segue.destinationViewController as!  DeviceJoinViewController
        mapViewController.delegate = self

     }
}

當然,這假定您的第二個VC名為SecondViewController如果沒有,則相應地更改該部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM