在 WatchKit 中的接口控制器之间传递数据

Passing data between interface controller in WatchKit

我在实现两个 WatchKit 接口控制器之间的数据传递时遇到了问题。我想将数据从第一个接口控制器传递到另一个接口控制器。第一个接口控制器工作正常,没有任何问题,但第二个接口控制器没有从第一个接口控制器获取数据。

这是我的结构:

struct gameStruct: Codable {
    var id: String
    var image: String
    var gameName: String
    var gameDate: String
    var gameVideo: String
    var gameSite: String   
}

这是第一个界面控制器中的代码:

var gameWatchArray = [gameStruct]()
let getDataURL = "http://ya-techno.com/gameApp/gameData.php"

class InterfaceController: WKInterfaceController {
    @IBOutlet var tableView: WKInterfaceTable!

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

        let URLgame = URL(string: getDataURL)
        URLSession.shared.dataTask(with: URLgame!) { (data, response, error) in
            do {
                guard let data = data else { return }
                gameWatchArray = try JSONDecoder().decode([gameStruct].self, from: data)

            } catch {
                print("error parse")
            }
            DispatchQueue.main.async {
                self.tableView.setNumberOfRows(gameWatchArray.count, withRowType: "gameRow")

                for (gameNameIndex, game) in gameWatchArray.enumerated() {
                    let row = self.tableView.rowController(at: gameNameIndex) as! gameRow
                    let url  = NSURL(string: "http://www.ya-techno.com/gamesImage/\(game.image)")
                    guard let data = NSData(contentsOf: url! as URL) else { return }
                    row.gameImage.setImageData(data as Data)
                }
                for index in gameWatchArray {
                    index.gameName
                    index.gameDate
                    index.image
                    print("JSON V3 array is :\(index.gameName)")

                }
                print("JSON V3 array is :\(gameWatchArray.count)")

            }

            }.resume()
        }



    override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) {

        self.pushController(withName: "showDetails", context: gameWatchArray[rowIndex])
    }

这是我项目中的详细信息界面:

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

    if let detailData = context as? String {
        gameNameLabel.setText(detailData)
    }

}

我正在使用 json 来解析数据。

问题是您将使用 self.pushController(withName: "showDetails", context: gameWatchArray[rowIndex])gameStruct 实例从第一个界面控制器传递到第二个界面控制器,但随后您试图将 gameStruct 转换为 String,这显然会失败。

您应该修改第二个接口控制器中的 awake(withContext:) 以有条件地将 context 转换为 gameStruct 然后访问该结构的 gameName 属性将 String 名称分配给标签的文本。

将来您应该始终处理条件转换失败的情况,以便在转换失败时通过打印消息更容易地发现问题。或者,如果您 100% 确定 context 将始终属于某种类型,您甚至可以强制转换,这将使您能够在开发阶段的早期发现编程错误。

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

    if let gameDetails = context as? gameStruct {
        gameNameLabel.setText(gameDetails.gameName)
    } else {
        print("Passed context is not a gameStruct: \(context)")
    }
}

您还应遵守 Swift 命名约定,即类型名称采用 UpperCamelCase,因此将 gameStruct 更改为 GameStruct