IOS Swift,委托在两个视图控制器之间进行通信
IOS Swift, delegate to communicate between two view controllers
我的应用程序有一个主视图控制器,其中显示来自蓝牙设备的信息。要连接到蓝牙设备,我会转到另一个视图控制器以连接到想要的蓝牙设备。然后我订阅那个蓝牙设备,它在每次蓝牙设备发送数据时调用一个函数。
选择要连接的设备后,我返回到主屏幕,我想在其中显示我正在接收的数据。我可以看到从蓝牙设备接收数据包的事件在切换回主屏幕后仍在工作,并在辅助视图控制器代码中打印。
我的问题是我想在我的第二个视图控制器中接收到这个数据,并在每次接收到它时将它发送到主视图控制器。由于我不能使用 segues 因为我没有跳回到辅助视图控制器,所以我决定尝试使用委托进行通信。
这是我目前在第二个视图控制器中添加的内容,即发送数据的视图控制器:
在辅助视图控制器中,在 class 之前:
protocol sendLatLonDelegate : class{
func sendReceiveData(data:AnyObject?)
}
在我的辅助视图控制器的顶部 class 和我的其他变量
weak var delegate:sendLatLonDelegate?
在我从蓝牙设备接收数据包时调用的函数中
delegate?.sendReceiveData(latFloat)
这是我在接收数据的主视图控制器中添加的内容:
将此添加到 class 定义中
class ViewController: UIViewController,sendLatLonDelegate {
并在我的 class 中添加了
func sendReceiveData(data:AnyObject?) {
print("received data")
}
在尝试将接收到的数据值发送到主视图控制器之前,我正在打印接收到的数据值,并且可以正确地看到它。不过我没有看到我收到的数据打印出来。
它可能很小 link 我没有意识到我在两者之间失踪了,但我似乎找不到它是什么。有人有建议吗?非常感谢!
编辑:根据答案中的推荐,添加
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)
{
if (segue.identifier == "ConnectDeviceSegue")
{
let mapViewController = segue.destinationViewController as! ViewController
mapViewController.delegate = self
}
}
现在出现错误 'ViewController' 类型的值在第 mapViewController.delegate 行没有成员 'delegate' = self
好的,从评论中我们得知您没有设置 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
- 如果不是,请相应地更改该部分。
我的应用程序有一个主视图控制器,其中显示来自蓝牙设备的信息。要连接到蓝牙设备,我会转到另一个视图控制器以连接到想要的蓝牙设备。然后我订阅那个蓝牙设备,它在每次蓝牙设备发送数据时调用一个函数。
选择要连接的设备后,我返回到主屏幕,我想在其中显示我正在接收的数据。我可以看到从蓝牙设备接收数据包的事件在切换回主屏幕后仍在工作,并在辅助视图控制器代码中打印。
我的问题是我想在我的第二个视图控制器中接收到这个数据,并在每次接收到它时将它发送到主视图控制器。由于我不能使用 segues 因为我没有跳回到辅助视图控制器,所以我决定尝试使用委托进行通信。
这是我目前在第二个视图控制器中添加的内容,即发送数据的视图控制器:
在辅助视图控制器中,在 class 之前:
protocol sendLatLonDelegate : class{
func sendReceiveData(data:AnyObject?)
}
在我的辅助视图控制器的顶部 class 和我的其他变量
weak var delegate:sendLatLonDelegate?
在我从蓝牙设备接收数据包时调用的函数中
delegate?.sendReceiveData(latFloat)
这是我在接收数据的主视图控制器中添加的内容:
将此添加到 class 定义中
class ViewController: UIViewController,sendLatLonDelegate {
并在我的 class 中添加了
func sendReceiveData(data:AnyObject?) {
print("received data")
}
在尝试将接收到的数据值发送到主视图控制器之前,我正在打印接收到的数据值,并且可以正确地看到它。不过我没有看到我收到的数据打印出来。
它可能很小 link 我没有意识到我在两者之间失踪了,但我似乎找不到它是什么。有人有建议吗?非常感谢!
编辑:根据答案中的推荐,添加
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)
{
if (segue.identifier == "ConnectDeviceSegue")
{
let mapViewController = segue.destinationViewController as! ViewController
mapViewController.delegate = self
}
}
现在出现错误 'ViewController' 类型的值在第 mapViewController.delegate 行没有成员 'delegate' = self
好的,从评论中我们得知您没有设置 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
- 如果不是,请相应地更改该部分。