2015-04-19 12 views
1

我在我的Apple Watch應用程序中使用包含WKInterfaceSwitch的行的表。同一行控制器有10行,其中包括一個開關。換句話說,在一個表的10個不同行中有10個開關,其中每行是同一行控制器的一個實例。表格行中的WKInterfaceSwitch或WKInterfaceButton - 哪一行被觸動?

當用戶觸摸開關並更改其狀態時,會調用操作方法,但不會傳遞對開關的引用,僅傳遞其新值。對於WKInterfaceButton也是如此 - 與UIKit不同,不傳遞任何引用。

那麼如何知道10個開關(或按鈕)中的哪一個被觸摸?

瞭解我不能爲每個交換機的操作分配不同的選擇器,因爲它們都是同一類的實例,即行控制器。

這有可能是不可能的嗎?

回答

4

您可以通過向您的行控制器類添加自定義委託來完成此操作。在配置行控制器時,將您的接口控制器設置爲委託。然後,確保您在行控制器中處理您的開關/按鈕操作。調用委託並傳遞可能在行控制器中配置的任何其他信息。

+1

輝煌!所以我在我的行控制器上創建了兩個新的屬性:1對持有該表的「委託」接口控制器的弱引用,以及保存行號的int。然後,交換機在行控制器中調用一個操作,該操作調用委託中的方法,傳入值和行號。 –

+0

任何代碼示例? –

0

下面是示例代碼reffering @Mike斯旺森的回答

// 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 
    } 
} 
相關問題