Swift WatchConnectivity应用程序上下文为Dictionary

时间:2017-08-28 10:59:27

标签: ios swift watchkit watchconnectivity

我正在开发我的第一个Apple Watch应用程序(我的iOS应用程序的扩展)。我在将数据从一个WKInterfaceController发送到另一个WKInterfaceController时面临一个小问题。

我的第一个控制器(InterfaceController.swift)didReceiveMessage,它从我的iOS应用程序接收数据。

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
        let myQrValue = message["qrCode"] as! String
        let myQrImage = message["qrCodeImageData"] as! Data

        var myData: [AnyHashable: Any] = ["myQrValue": myQrValue, "myQrImage": myQrImage]

        if myQrValue.isEmpty == false {
            WKInterfaceController.reloadRootControllers(withNames: ["QrScreen"], contexts: [myData])
        }
    } 

然后在我的第二个控制器(QrInterfaceController.swift)中,我在下面获取从第一个控制器发送的数据 -

override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        print("context \(context)")
        if let myData = context {
            print("myData \(myData)")
//            userQrNumber.setText(myData)
        }

        if let myQrImage = myQrImage {
            userQrImage.setImageData(myQrImage)
        }

        if let myQrLabel = myQrLabel {
            userQrNumber.setText(myQrLabel)
        }

        self.setTitle("")
    }

我被困(可能是简单/愚蠢的问题)如何从第二个控制器中的上下文解析我的数据?

此外,当我启动放置sendMessage代码的ViewController时,didReceiveMessage仅第二次工作。这是正常的吗?

1 个答案:

答案 0 :(得分:2)

首先,您可能希望重新声明myData

var myData: [String: Any] = ...

这使它更简单。然后,在awake函数中,你将继续这样:

if let myData = context as? [String: Any] {
    if let myQrImage = myData["myQrValue"] as? Date {
        ...

这是否显示了正确的方向?