繁体   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