如何使用 Watch Connectivity 从 iPhone 发送的 [String] 数组填充 table 行?
How to populate table rows, using a [String] array sent from iPhone by Watch Connectivity?
基本上,它可以很好地传递数组。只是在尝试将枚举数组用作表行时,它说找不到。
PHONE
import UIKit
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
@IBOutlet weak var sendButton: UIButton!
var watchSession: WCSession?
var arrayCustom = ["thing1", "thing2"]
override func viewDidLoad() {
super.viewDidLoad()
if(WCSession.isSupported()) {
watchSession = WCSession.defaultSession()
watchSession?.delegate = self
watchSession?.activateSession()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func sendArray(sender: AnyObject) {
sendToWatch()
}
private func sendToWatch() {
do {
let applicationDict = ["Array1": arrayCustom]
try WCSession.defaultSession().updateApplicationContext(applicationDict)
}
catch {
print(error)
}
}
}
手表
private func loadThCust() {
if (WCSession.isSupported()) {
watchSession = WCSession.defaultSession()
watchSession.delegate = self;
watchSession.activateSession()]
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if let retrievedArray1 = applicationContext["Array1"] as? [String] {
self.custArray = retrievedArray1
print(self.custArray)
}
for (index, thName) in self.custArray.enumerate() {
let row2 = self.choiceTable.rowControllerAtIndex(index) as! ChoiceTableRowController
row2.choiceLabel.setText(thName)
}
}
}
我的问题是每当我尝试加载 TableView 时都会收到此控制台输出 + 错误:
["thing1", "thing2"]
2016-02-24 03:21:25.912 WristaRoo WatchKit Extension[9401:243561] Error - attempt to ask for row 0. Valid range is 0..0
fatal error: unexpectedly found nil while unwrapping an Optional value
有谁知道为什么展开后的值仍然为零?我希望一旦我设置好它并且可以看到 [String] 数组中有值,它可以枚举它,但看起来它们只是不可见的。
问题的开头是"Basically, It's passing the array fine",所以这不是手表连接问题。
您只是在遍历数组之前没有指定 choiceTable
的行数。
choiceTable.setNumberOfRows(custArray.count, withRowType: "ChoiceTableRowController")
从控制台输出判断问题:
错误 - 尝试请求第 0 行。有效范围是 0..0
rowControllerAtIndex:
returns(可选)当其索引超出范围时为零。
The row controller object, or nil if there are no row controllers yet or index is out of bounds.
您试图访问不存在的行,导致出现边界警告。
致命错误:在展开可选值时意外发现 nil
row2.choiceLabel.setText(thName)
row2
为零。
您应该能够在调试器中轻松找到此类错误。如果您检查 row2
并发现它为零,您就会意识到问题不在于数组本身,而是 table 没有行。
基本上,它可以很好地传递数组。只是在尝试将枚举数组用作表行时,它说找不到。
PHONE
import UIKit
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
@IBOutlet weak var sendButton: UIButton!
var watchSession: WCSession?
var arrayCustom = ["thing1", "thing2"]
override func viewDidLoad() {
super.viewDidLoad()
if(WCSession.isSupported()) {
watchSession = WCSession.defaultSession()
watchSession?.delegate = self
watchSession?.activateSession()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func sendArray(sender: AnyObject) {
sendToWatch()
}
private func sendToWatch() {
do {
let applicationDict = ["Array1": arrayCustom]
try WCSession.defaultSession().updateApplicationContext(applicationDict)
}
catch {
print(error)
}
}
}
手表
private func loadThCust() {
if (WCSession.isSupported()) {
watchSession = WCSession.defaultSession()
watchSession.delegate = self;
watchSession.activateSession()]
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if let retrievedArray1 = applicationContext["Array1"] as? [String] {
self.custArray = retrievedArray1
print(self.custArray)
}
for (index, thName) in self.custArray.enumerate() {
let row2 = self.choiceTable.rowControllerAtIndex(index) as! ChoiceTableRowController
row2.choiceLabel.setText(thName)
}
}
}
我的问题是每当我尝试加载 TableView 时都会收到此控制台输出 + 错误:
["thing1", "thing2"]
2016-02-24 03:21:25.912 WristaRoo WatchKit Extension[9401:243561] Error - attempt to ask for row 0. Valid range is 0..0
fatal error: unexpectedly found nil while unwrapping an Optional value
有谁知道为什么展开后的值仍然为零?我希望一旦我设置好它并且可以看到 [String] 数组中有值,它可以枚举它,但看起来它们只是不可见的。
问题的开头是"Basically, It's passing the array fine",所以这不是手表连接问题。
您只是在遍历数组之前没有指定 choiceTable
的行数。
choiceTable.setNumberOfRows(custArray.count, withRowType: "ChoiceTableRowController")
从控制台输出判断问题:
错误 - 尝试请求第 0 行。有效范围是 0..0
rowControllerAtIndex:
returns(可选)当其索引超出范围时为零。The row controller object, or nil if there are no row controllers yet or index is out of bounds.
您试图访问不存在的行,导致出现边界警告。
致命错误:在展开可选值时意外发现 nil
row2.choiceLabel.setText(thName)
row2
为零。
您应该能够在调试器中轻松找到此类错误。如果您检查 row2
并发现它为零,您就会意识到问题不在于数组本身,而是 table 没有行。