【问题标题】:WKInterfaceTable is not getting populated with Codable dataWKInterfaceTable 未填充可编码数据
【发布时间】:2018-11-19 03:20:58
【问题描述】:

我的 JSON 对象没有被发送到我的 WKInterfaceTable。

UITableView 填充正确。最后一步是填充 WKInterfaceTable。该代码没有在 Xcode 中引发错误,但由于强制转换失败而导致运行时崩溃。

编辑:感谢 Dale,我修复了错误处理行,因此运行时消息消失了,但同样的问题仍然存在。

打印LoadedData:可选() P>

    override func willActivate() {
         super.willActivate()

        if(WCSession.default.isReachable) {

            let message = ["getMsgData" : [:]]

            WCSession.default.sendMessage(message, replyHandler:

                { (result) -> Void in

                    print("Requesting data from phone")
                    print("printing message: \(message)")
                    print("printing messageObjects: \(self.messageObjects)")

                    if result["messageData"] != nil { 
                        let loadedData = result["messageData"]

                        NSKeyedUnarchiver.setClass(MessageObject.self, forClassName: "MessageObject")

                        do {
                            let loadedPerson = try? JSONDecoder().decode(MessageObject.self, from: loadedData as! Data)

                            self.messageObjects = [loadedPerson]
                            self.progTable.setNumberOfRows(self.messageObjects.count, withRowType: "MsgRowController")

               //code...
    }

【问题讨论】:

  • 如果 loadedPerson 为 nil 即解码失败,则转换将失败。而不是使用尝试?你应该正确处理错误。
  • 谢谢。将其更改为let loadedPerson = try JSONDecoder().decode,然后更改为self.messageObjects = [loadedPerson]。我注意到 MessageInterfaceController 中的 print("Sending a message to the phone asking it for data") 正在打印到控制台,但 WKInterfaceTable/rows 仍然没有显示。所以willActivate 中的某些内容肯定是错误的。不再出现运行时崩溃,但表数据未显示。
  • 你应该单独调试你的 JSON 解码。错误消息确实在告诉您问题所在 - 它无法解析 JSON,因为它的格式不正确。看起来您的 JSON 是一个数组,但您要求解码单个对象。尝试使用 [MessageObject].self 作为 JSONDecoder().decode 中的类型。然后,loadedPerson 将是一个数组,您可以直接将其分配给 self.messageObjects 而无需包含在 [ ]
  • 你好戴尔。实际上我只是重构了我的 Codable 模型,当我这样做时,我发现问题是我在两个 VC 中都有以前的 NSKeyedArchiver/Unarchiver 方法,所以它基本上停止了我的应用程序,因为它不知道是使用 NSKeyed 还是 JSONDecoder。 Xcode 没有给出任何错误,没有任何警告。我只需要做一些重构就可以自己找出问题所在。感谢您的提示。当我这样做时,Xcode 也警告我要更改您提到的区域。

标签: swift codable watchconnectivity wcsession wkinterfacetable


【解决方案1】:

在更新到使用 Codable 协议的过程中,我没有意识到我必须删除以前的 NSKeyedArchiver/Unarchiver 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多