我遇到了在两个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来解析数据。
答案 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
。