在WatchKit

时间:2018-05-31 14:02:46

标签: swift watchkit apple-watch

我遇到了在两个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])
    }

这是我项目中的Detail界面:

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

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

}

我使用json来解析数据。

1 个答案:

答案 0 :(得分:2)

问题是您使用gameStruct从第一个接口控制器传递self.pushController(withName: "showDetails", context: gameWatchArray[rowIndex])实例到第二个接口控制器,但是您尝试将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