2015-09-15 5 views
9

In meinem UITableViewController ich eine benutzerdefinierte Zelle haben, die einen Umschalter whoce enthält, ist die folgende:Swift/UISwitch: wie ein Delegierter/Zuhörer zu implementieren

import Foundation 
import UIKit 

class SwitchCell: UITableViewCell { 
    @IBOutlet weak var label : UILabel! 
    @IBOutlet weak var switchEmail : UISwitch! 

    func setEditable(canEdit:Bool) { 
     if (canEdit) { 
     self.switchEmail.enabled = true 
     self.label.highlighted = false 
     } 
     else { 
      self.switchEmail.enabled = false 
      self.label.highlighted = true 
     } 
    } 

    func configureCellWithSwitch(labelText:String, switchValue:Bool, enabled:Bool) { 

    var labelFrame:CGRect = self.label.frame 
    labelFrame.size.height = Settings.labelHeight 
    self.label.frame = labelFrame 

    self.label.text = labelText 

    if (switchValue) { 
     self.switchEmail.setOn(true, animated: true) 
    } 
    else { 
     self.switchEmail.setOn(false, animated: true) 
    } 

    self.setEditable(enabled) 

    } 
} 

Ich möchte wissen, wie ein Zuhörer zu implementieren/Delegierte an den Switcher, um seinen Wert vom UITableViewController zu erhalten. Ich war in der Lage Delegierten/Hörer für die Zelle zu schreiben, mit UITextField und UITextView die Methoden der Umsetzung

func controller(controller: UITableViewCell, textViewDidEndEditing: String, atIndex: Int) 

und

func controller(controller: UITableViewCell, textFieldDidEndEditingWithText: String, atIndex: Int) 

aber ich weiß nicht, was ich für den Schalter implementieren soll.

Antwort

29

UISwitch hat kein Delegiertenprotokoll. Sie können auf den Status hören wie folgt:

ObjC:

// somewhere in your setup: 
[self.mySwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 


- (void)switchChanged:(UISwitch *)sender { 
    // Do something 
    BOOL value = sender.on; 
} 

Swift:

mySwitch.addTarget(self, action: "switchChanged:", forControlEvents: UIControlEvents.ValueChanged) 

func switchChanged(mySwitch: UISwitch) { 
    let value = mySwitch.on 
    // Do something 
} 

swift3:

mySwitch.addTarget(self, action: #selector(switchChanged), for: UIControlEvents.valueChanged) 

func switchChanged(mySwitch: UISwitch) { 
     let value = mySwitch.isOn 
     // Do something 
    } 
+0

Ok, das ist, was ich in der Klasse Zelle in der init gerade geschrieben habe(). Ich würde gerne wissen, wie kann ich den Switch-Wert von meinem Tabellenansicht-Controller abrufen ... Welche Methode sollte ich dort implementieren? –

+1

@LoryLory sehe mein Update: der Wert von 'UISwitch' ist über' .on' verfügbar – Daniel

+0

Ah ok, sollte diese Methode innerhalb der TableView rechts sein? Ich dachte, es wäre in der benutzerdefinierten Klassenzelle ... deshalb wusste ich nicht, wie man den Wert aus dem Tabellenansicht-Controller –

2

ich haben die Lösung in Objective-C, es ist die Methode, die ich regelmäßig verwende:

-Die Aktion des Switches muss im Tabellenansicht-Controller und nicht in der Zelle sein

-Wenn Sie auf den Schalter im Inneren der Aktion tippen können Sie dies tun, um die richtige Zelle zu finden, dann können Sie leicht den Index oder einen anderen Wert finden das brauchst du ...

- (IBAction)switchValueChanged:(UISwitch *)sender 
{ 
    YourCellClass *cell = (YourCellClass *)[sender findSuperViewWithClass:[YourCellClass class]]; 
     etc.... 
    } 

Verfahren findSuperviewWithClass ist eine Kategorie auf UIView

- (UIView *)findSuperViewWithClass:(Class)superViewClass 
{ 
    UIView *superView = self.superview; 
    UIView *foundSuperView = nil; 

    while (nil != superView && nil == foundSuperView) 
    { 
     if ([superView isKindOfClass:superViewClass]) 
     { 
      foundSuperView = superView; 
     } else 
     { 
      superView = superView.superview; 
     } 
    } 
    return foundSuperView; 
} 
2

Swift 3:

@IBOutlet weak var mySwitch: UISwitch! 

mySwitch.addTarget(self, action: #selector(MyClass.switchChanged(_:)), for: UIControlEvents.valueChanged) 

func switchChanged(_ mySwitch: UISwitch) { 
    if mySwitch.isOn { 
     // handle on 
    } else { 
     // handle off 
    } 
} 
5

Swift 3:

Mit Storyboard Automatische Anordnung:

Verweis hinzufügen:

@IBOutlet weak var sampleSwitch: UISwitch! 

Mitarbeiterin Methode:

@IBAction func sampleSwitchValueChanged(_ sender: Any) { 

    if sampleSwitch.isOn { 
     print("ON") 
    } 
    else { 
     print ("OFF") 
    } 
} 

programmatische Art und Weise:

Hinzufügen Ziel:

sampleSwitch.addTarget(self, action: #selector(ViewController.sampleSwitchValueChanged(sender:)), for: UIControlEvents.valueChanged) 

Das Verfahren mit dem Schalter verbunden:

func sampleSwitchValueChanged(sender: UISwitch!) 
    { 
     if sender.isOn { 

      print("switch on") 

     } else { 

     } 
    } 
1

Weiteres (Swift 3 oder 4) Methode didSet Beobachter zu verwenden ist und drastisch reduziert Code, wie sogenannte

In der Klasse deklarieren Sie eine Variable wie folgt:

var switchFlag: Bool = false { 
     didSet{    //This will fire everytime the value for switchFlag is set 
      print(switchFlag) //do something with the switchFlag variable 
     } 
    } 

Dann können Sie eine haben IBAction auf dem UISwitch wie so

@IBAction func switchChanged(_ sender: Any) { 
     if self.mySwitch.isOn{ 
      switchFlag = true 
     }else{ 
      switchFlag = false 
     } 
    } 
Verwandte Themen