2017-09-07 4 views
0

MeditationSettingsViewController hat eine UISwitch, die mit MeditationScreenViewController über eine Segue verbunden ist. Die UISwitch versteckt nicht den Text in der Bezeichnung phaselabel von MeditationScreenViewController, sondern zeigt stattdessen den Bildschirm MeditationSettingsViewController an. Wie bekomme ich es, dass der Switch das nicht tut, aber phaselabel ein- und ausblendet, wenn der Schalter ein-/ausgeschaltet wird?Einen UISwitch ein-/ausblenden lassen, wenn er ein-/ausgeschaltet wird

class MeditationSettingsViewController: UIViewController { 

@IBAction func showCycleTitleChanged(_ sender: UISwitch) { 
    if (sender.isOn == true) 
    { 
     func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
      if segue.identifier == "segue" { 
       if let sendToDetailViewController = segue.destination as? MeditationScreenViewController { 
        sendToDetailViewController.isSwitchOn = sender!.isOn 
       } 

      } 

class MeditationScreenViewController: UIViewController { 

override func viewWillAppear(_ animated: Bool) { 
    if isSwitchOn == true { 
     //unhide the label 
     self.phaseLabel.isHidden = true 
     //set your label value here 
    } 
    else { 
     self.phaseLabel.isHidden = false 
    } 
} 
+0

Nur um klar zu sein, möchten Sie den Schalter ein-/ausschalten, um die Phasenbezeichnung in einem anderen View-Controller ein-/auszublenden, nicht wahr? Wie wird der MeditationScreenViewController auf dem Bildschirm angezeigt? – aksh1t

+0

Ja, das stimmt. Es wird durch Klicken auf Abbrechen in einem Popup-Fenster angezeigt. Das Popup-Fenster ist mit dem MeditationSettingsViewController verbunden. –

+0

Sie müssen irgendwie eine (schwache) Referenz auf die 'Phasenmarkierung' in' MeditationSettingsViewController' erhalten, damit Sie sie ein- und ausblenden können. Eine andere Möglichkeit wäre, den "MeditationScreenViewController" irgendwie (durch die Verwendung von NSNotificationCenter oder Delegierung) auf den Schalter hin und her schalten zu lassen und dann die Beschriftung dort ein-/auszublenden. Es ist schwierig für mich, Code zu geben, ohne die Struktur Ihres Projekts zu kennen. – aksh1t

Antwort

1

Versuchen NSNotificationCenter mit den beiden View-Controller sich der Schaltzustand ändern zu lassen.

In MeditationSettingsViewController in der showCycleTitleChanged Funktion, dies zu tun:

@IBAction func showCycleTitleChanged(_ sender: UISwitch) { 
    let data:[String: Bool] = ["state": sender!.isOn] 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "switchChanged"), object: nil, userInfo: data) 
} 

In MeditationScreenViewController, wie so die Meldung hören:

In viewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(self.showHideLabel(_:)), name: NSNotification.Name(rawValue: "switchChanged"), object: nil) 

Auch diese Funktion in der Behandeln Sie die Benachrichtigung:

func showHideLabel(_ notification: NSNotification) { 
    self.phaselabel.isHidden = notification.userInfo?["state"] as? Bool 
} 
+0

Es sagt "MeditationSettingsViewController" hat kein Mitglied phaseLabel und funktioniert nicht. –

+0

Ja showCycleTitleChanged ist mit dem WertChanged des UISwitch verbunden. –

+0

Ist es normal, eine Funktion in ibaction aufzurufen? – Vimal

Verwandte Themen