prepareInSegue基于rowindex在WatchKit中等效

时间:2016-02-17 23:58:02

标签: ios watchkit

我一直在尝试根据所选行在WatchKit中设置分层表。

我知道这涉及使用contextForSegueWithIdentifier

有人可以解释如何将选定的行详细信息提供给目标接口控制器吗?

@IBOutlet var mainTable:WKInterfaceTable!

let mains = ["Full Schedule", "Custom Sched."]

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    loadTableData()
}

private func loadTableData() {

    mainTable.setNumberOfRows(mains.count, withRowType: "InterfaceTableRowController")

    for (index, mainName) in mains.enumerate() {

        let row = mainTable.rowControllerAtIndex(index) as! InterfaceTableRowController

        row.interfaceLabel.setText(mainName)
    }

}

override func contextForSegueWithIdentifier(segueIdentifier: String, inTable table: WKInterfaceTable, rowIndex: Int) -> AnyObject?
{

    let mainName = mains[rowIndex]
    return mainName
}


override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
    NSLog("%@ will activate", self)
}

好的,所以这就是我[我只是我的控制器之一],并假设如果我选择完整的时间表,它将显示星期四的列表>星期五>周六>星期天....但如果我选择自定义它会显示名称>名称>名称>名称

1 个答案:

答案 0 :(得分:1)

简而言之,它与prepareForSegue略有相似,但是您返回一个要传递给目标接口控制器的上下文,而不是直接在目标接口控制器上设置属性。

  1. 在源界面控制器中,您覆盖contextForSegueWithIdentifier,并检查故事板segueIdentifier以确定正在发生的segue。

  2. 接下来,您使用rowIndex从其mains数组中检索该行的数据。

  3. 最后,您将返回该数据,该数据将是目标接口控制器将访问的上下文。

    在您的示例中,您将返回表示所选计划类型的字符串:

    override func contextForSegueWithIdentifier(segueIdentifier: String, inTable table: WKInterfaceTable, rowIndex: Int) -> AnyObject? {
        if segueIdentifier == "showSchedule" {
            return mains[rowIndex]
        }
        return nil
    }
    
  4. 在目标接口控制器中,您可以访问提供的上下文。

    在这种情况下,它是所选计划的类型。您为该类型的计划配置了数组,然后填充表。

    @IBOutlet weak var scheduleTable: WKInterfaceTable!
    
    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
    
        // Configure table here.
        guard let context = context as? String else {
            return
        }
    
        // Load the table based on the type of (full or custom) schedule
        if context == "Full schedule" {
           loadFullSchedule()
        } else if context == "Custom Sched." {
           loadCustomSchedule()
        }
    }