在 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
。
我在实现两个 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
。