WkInterfaceSwitch im dynamischen WkInterfaceTable

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • WkInterfaceSwitch im dynamischen WkInterfaceTable

    Hallo zusammen,

    wie bekommen ich im WatchKit aus einem Table die Value und den Sender von zum Beispiel einem Control-Element wie WkInterfaceSwitch.

    Im IOS geht das ja wie folgt:

    Quellcode

    1. cell.switch.tag = indexPath.row
    2. cell.switch.addTarget(self, action: #selector(switchSetValue), for: .valueChanged)
    3. @objc func switchSetValue(sender: UISwitch) {
    4. }
    Wie bekomme ich das in WatchOS hin?
    Könnt Ihr mir da bitte helfen. Danke :)

    Gruß
    Martin
  • Danke dir matz.
    Komme jedoch irgendwie nicht weiter.
    Ich habe eine TableRow Klasse und darin ist das Protokoll sowie die IBAction vom Switch mit dem Delegate.
    Im InterfaceController wird die Funktion "getValue" nicht ausgeführt und ich sehe nicht die Value vom Switch.
    Verstehe ich das mit dem Delegate falsch? Oder was ist das Problem?

    Hier mein Code:

    Quellcode

    1. protocol testDelegate {
    2. func getvalue(value: Bool)
    3. }
    4. class classTableViewRowSwitch: NSObject {
    5. var delegate: testDelegate?
    6. @IBOutlet var controlSwitch: WKInterfaceSwitch!
    7. @IBAction func switchAction(value: Bool) {
    8. delegate?.getvalue(value: true)
    9. }
    10. }
    Alles anzeigen

    Quellcode

    1. class wTestController: WKInterfaceController, testDelegate {
    2. @IBOutlet var tableView: WKInterfaceTable!
    3. var arraySwitch = ["Test", "Test2"]
    4. override func awake(withContext context: Any?) {
    5. super.awake(withContext: context)
    6. }
    7. override func willActivate() {
    8. super.willActivate()
    9. setupTableView()
    10. }
    11. func getvalue(value: Bool) {
    12. print(value)
    13. }
    14. func setupTableView() {
    15. tableView.setNumberOfRows(arraySwitch.count, withRowType: "rowSwitch")
    16. for i in 0 ..< arraySwitch.count {
    17. if let row = tableView.rowController(at: i) as? classTableViewRowSwitch {
    18. let name = String(arraySwitch[i])
    19. row.controlSwitch.setTitle(name)
    20. }
    21. }
    22. }
    23. }
    Alles anzeigen
  • Funktioniert leider nicht.
    Habe "let rowC = classTableViewRowSwitch() rowC.delegate = self" hinzugefügt.
    Meinst es so oder anders?

    Quellcode

    1. class wTestController: WKInterfaceController, testDelegate {
    2. @IBOutlet var tableView: WKInterfaceTable!
    3. var arraySwitch = ["Test", "Test2"]
    4. override func awake(withContext context: Any?) {
    5. super.awake(withContext: context)
    6. }
    7. override func willActivate() {
    8. super.willActivate()
    9. let rowC = classTableViewRowSwitch()
    10. rowC.delegate = self
    11. setupTableView()
    12. }
    13. func getvalue(value: Bool) {
    14. print(value)
    15. }
    16. func setupTableView() {
    17. tableView.setNumberOfRows(arraySwitch.count, withRowType: "rowSwitch")
    18. for i in 0 ..< arraySwitch.count {
    19. if let row = tableView.rowController(at: i) as? classTableViewRowSwitch {
    20. let name = String(arraySwitch[i])
    21. row.controlSwitch.setTitle(name)
    22. }
    23. }
    24. }
    25. }
    Alles anzeigen
  • MacMartin schrieb:


    Vor allem würde mich der Performance-und Zuverlässigkeitsunterschied zwischen Delegate und Notification interessieren...
    Naja, bei der Nutzung eines Delegates rufst Du direkt eine vereinbarte (vgl. "Protokoll") Methode eines Objektes auf. Welches Objekt das ist, wurde über eine Variable, den sogenannten Delegate, festgelegt. Also letztlich ein direkter Methodenaufruf.

    Bei Notifications fungiert das Notification-Center quasi als Drehscheibe (Message-Broker) zwischen Objekten. Hier können sich Objekte als Abonnenten bestimmter Meldungen registrieren und werden getriggert, wenn eine entsprechende Nachricht im Center einging.

    Notifications können sehr hilfreich sein, wenn der Verursacher eigentlich gar keine Kenntnis über die Empfänger einer Statusmeldung hat und evt. sogar mehrere Empfänger existieren. Mir fällt da spontan die Änderung von Daten im MVC-Konzept ein. Wenn diese beiden Gründe nicht gegeben sind, würde ich immer einen direkten Methodenaufruf vorziehen ... und er dürfte auch - ohne das jetzt quantifizieren zu können - deutlich performanter sein.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke euch.
    Habe es mit dem Delegate nun hinbekommen
    Den Delegate musste ich im setupTableView() setzen.

    Quellcode

    1. func setupTableView() {
    2. tableView.setNumberOfRows(arraySwitch.count, withRowType: "rowSwitch")
    3. for i in 0 ..< arraySwitch.count {
    4. if let row = tableView.rowController(at: i) as? classTableViewRowSwitch {
    5. let name = String(arraySwitch[i])
    6. row.controlSwitch.setTitle(name)
    7. row.delegate = self
    8. }
    9. }
    10. }