我的Apple Watch应用程序中有一个表,其中包含一个包含WKInterfaceSwitch的行。同一行控制器有10行,包括一个开关。换句话说,在表的10个不同行中有10个开关,其中每行是同一行控制器的实例。
当用户触摸开关并更改其状态时,将调用action方法,但不会传递对该开关的引用,仅传递其新值。类似地,对于WKInterfaceButton - 与UIKit不同,没有传递参考。
那么我怎么知道触摸了10个开关(或按钮)中的哪一个?
明白我不能为每个开关的动作分配不同的选择器,因为它们都在同一个类的实例中,即行控制器。
有可能它是不可能的吗?
答案 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
}
}