如何使用Watch Connectivity从iPhone发送的[String]数组填充表行?

时间:2016-02-24 08:27:49

标签: swift watchkit watch-os-2 watchconnectivity

基本上,它将数组传递得很好。它只是在尝试使用枚举数组作为表格时,它说nil找到了。

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)
        }
    }
}

WATCHKIT

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]数组中有值,它可以枚举它,但看起来它们只是不可见。

1 个答案:

答案 0 :(得分:2)

你用声明开始了这个问题,"基本上,它正确地传递数组"所以它不是Watch Connectivity问题。

在迭代数组之前,您根本没有指定choiceTable的行数。

choiceTable.setNumberOfRows(custArray.count, withRowType: "ChoiceTableRowController")

从控制台输出中确定问题:

  • 错误 - 尝试询问行0.有效范围是0..0

    rowControllerAtIndex:在索引超出范围时返回(一个可选的)nil。

      

    行控制器对象,如果还没有行控制器或索引超出范围,则为nil。

    您试图访问不存在的行,从而导致边界警告。

  • 致命错误:在解包可选值时意外发现nil

    row2.choiceLabel.setText(thName)
    

    row2为零。

您应该能够在调试器中轻松跟踪此类错误。如果你检查了row2并发现它是零,你就会意识到问题不在于数组本身,而是表没有行。