IOS Swift,代表在两个视图控制器之间进行通信
我的应用程序有一个主视图控制器,其中显示来自蓝牙设备的信息。要连接到蓝牙设备,我需要连接到不同的视图控制器以连接到所需的蓝牙设备。然后,我订阅每次蓝牙设备发送数据时调用功能的蓝牙设备。IOS Swift,代表在两个视图控制器之间进行通信
选择要连接的设备后,我跳回到我想要显示正在接收的数据的主屏幕。我可以看到,从辅助视图控制器代码中切换回主屏幕后,从蓝牙设备接收数据包的事件仍然有效。
我的问题是,我想在我的第二个视图控制器中接收到这个数据,并在每次收到它时将它发送到主视图控制器。由于我不能跳回到辅助视图控制器,因此我不能使用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 =自
好了,从我们得到的意见,你没有设置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
- 如果不是,则相应更改的一部分。
感谢您的回答,我在最初的问题中编辑了代码,我相信我正在使用不同版本的swift,因此它与您的答案略有不同。我目前正在收到错误“类型”ViewController“的值没有成员'委托'” – lhbortho
看来你错了 - 你需要将它转换为第二个视图控制器的类型,那个具有'代表'财产。从我从你的代码中收集和理解的内容中,你将它投射到第一个视图控制器。 – Losiowaty
发送VC名为DeviceJoinViewController,接收者名为ViewController。我使用了相同的函数来访问ViewController中的变量,它的工作原理并不能确定这是问题所在。 (这也许是我对你的答案的理解) – lhbortho
那么,你是否将接收VC设置为代表? – Losiowaty
@Losiowaty您的第二个控制器没有收到任何委托值并且没有。您需要将代理从第一个控制器发送到第二个控制器。 –
@Losiowaty我没有,所以我想这可能是缺少的。你能否给我举一个例子,说明我应该怎么做?从简单的看,我认为我需要在发送VC中获得接收VC的实例,并将其设置为委托,但我不太确定如何去做。谢谢! – lhbortho