表行中的WKInterfaceSwitch或WKInterfaceButton - 触摸了哪一行?

时间:2015-04-19 20:13:57

标签: watchkit apple-watch

我的Apple Watch应用程序中有一个表,其中包含一个包含WKInterfaceSwitch的行。同一行控制器有10行,包括一个开关。换句话说,在表的10个不同行中有10个开关,其中每行是同一行控制器的实例。

当用户触摸开关并更改其状态时,将调用action方法,但不会传递对该开关的引用,仅传递其新值。类似地,对于WKInterfaceButton - 与UIKit不同,没有传递参考。

那么我怎么知道触摸了10个开关(或按钮)中的哪一个?

明白我不能为每个开关的动作分配不同的选择器,因为它们都在同一个类的实例中,即行控制器。

有可能它是不可能的吗?

2 个答案:

答案 0 :(得分:4)

您可以通过向行控制器类添加自定义委托来完成此操作。配置行控制器时,将接口控制器设置为委托。然后,确保在行控制器中处理开关/按钮操作。调用代理并传递您在行控制器中配置的任何其他信息。

答案 1 :(得分:0)

以下是提供@Mike Swanson答案的示例代码

// ListRowController.swift file: 
protocol rowButtonClicked {
    func rowClicked(atIndex:Int)
}

class ListRowController: NSObject {

 @IBOutlet var btnApply: WKInterfaceButton!

    let delegate : rowButtonClicked? = nil
    var rowNumber : Int = 0

  @IBAction func applyTapped()

    {
        print(rowNumber)
        self.delegate?.rowClicked(atIndex: rowNumber)

    }

}


//in class containing table
 dont forget to add delegate: rowButtonClicked 
override func awake(withContext context: Any?)
{
        super.awake(withContext: context)

     listView.setNumberOfRows(customTones.count, withRowType: "availableAlarmList")

        for index in 0..<listView.numberOfRows{
            if let controller = listView.rowController(at: index) as? ListRowController {

                controller.rowNumber = index
                controller.delegate = self
            }
        }
    func rowClicked(atIndex:Int) // delegate method which will give the row index
    {
        // do something here
    }
}