我一直在尝试根据选定的行在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)
}

好的,所以这是我[仅作为我的一个控制器]的位置,并假设如果我选择完整的日程表,它将显示星期四>星期五>星期六>星期日....的列表,但是如果我选择自定义,它将显示显示名称>名称>名称>名称

最佳答案

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

  • 在源接口控制器中,您将覆盖contextForSegueWithIdentifier,并检查情节提要segueIdentifier以确定发生了哪种segue。
  • 接下来,您使用rowIndex从其mains数组检索该行的数据。
  • 最后,您返回该数据,该数据将是目标接口控制器将访问的上下文。

    在您的示例中,您返回一个字符串,该字符串表示所选的日程表类型:
    override func contextForSegueWithIdentifier(segueIdentifier: String, inTable table: WKInterfaceTable, rowIndex: Int) -> AnyObject? {
        if segueIdentifier == "showSchedule" {
            return mains[rowIndex]
        }
        return nil
    }
    
  • 在目标接口控制器中,您访问提供的上下文。

    在这种情况下,它就是所选计划的类型。您将为该类型的日程表配置阵列,然后填充表。
    @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()
        }
    }
    
  • 10-07 19:51