IOS Swift,委托两个视图控制器之间进行通信

时间:2017-04-05 19:09:20

标签: ios swift delegates viewcontroller

我的应用程序有一个主视图控制器,显示来自蓝牙设备的信息。为了连接到蓝牙设备,我转到不同的视图控制器以连接到所需的蓝牙设备。然后我订阅了蓝牙设备,每次蓝牙设备发送数据时都会调用一个功能。

选择了我要连接的设备后,我会回到主屏幕,我想要显示我收到的数据。我可以看到,在使用辅助视图控制器代码中的打印切换回主屏幕后,从蓝牙设备接收数据包的事件仍然有效。

我的问题是我想在第二个视图控制器中接收这些数据,并在每次收到它时将其发送到主视图控制器。由于我不能使用segue因为我没有跳回到辅助视图控制器,所以我决定尝试使用委托来进行通信。

这是我到目前为止在第二个视图控制器中添加的内容,即发送数据的那个:

在辅助视图控制器中,在类之前:

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'没有会员'委托'在line mapViewController.delegate = self

1 个答案:

答案 0 :(得分:1)

好的,所以从评论中我们得到的是你没有设置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 - 如果不是,则相应地更改该部分。