2017-09-03 3 views
0

Was ich versuche zu tun, um eine segue für ein UISwitch verwenden, so kann ich die phaselabel auf dem ersten View-Controller namens UILabel loszuwerden, wenn der Schalter ausgeschaltet ist.Mit Ein-/Ausschalter, sich in verschiedenen Viewcontroller von UILabel befreien

Auf den ersten Blick Controller ich habe:

import UIKit 

class MeditationScreenViewController: UIViewController { 

    @IBOutlet var phaseLabel: UILabel! 

func settingsDidChange(_ settings: MeditationSettings) { 
    meditationSettings = settings 
    session = MeditationSession(settings: settings, phaseChangedBlock: { [weak self] (phaseName) in 
     debugPrint("Entering phase: \(phaseName)") 
     guard let strongSelf = self else { return } 
     strongSelf.phaseLabel.text = phaseName 
     switch phaseName { 
     case "Breathe In": 
      strongSelf.circleAnimation.animate(direction: CircleAnimationView.Direction.expand, time: TimeInterval(strongSelf.meditationSettings.breathIn)) 
     case "Breathe Out": 
      strongSelf.circleAnimation.animate(direction: CircleAnimationView.Direction.contract, time: TimeInterval(strongSelf.meditationSettings.breathOut)) 
     default: break 
     } 
    }, timeChangedBlock: { [weak self] phaseTime, phaseTotal in 
     self?.timeLabel.text = "\(Int(phaseTime))/\(Int(phaseTotal))" 
    }, completion: { [weak self] in 
     debugPrint("Finished") 
     self?.timeLabel.text = "" 
     self?.phaseLabel.text = "" 
     self?.startStopButton.isSelected = false 
    }) 
} 


override func viewWillAppear(_ animated: Bool) { 
    self.phaseLabel.text = name 
} 

Auf den zweiten View-Controller ich habe:

import UIKit 

var name: String = "" 

class MeditationSettingsViewController: UIViewController { 

    @IBOutlet var showCycleTitleLabel: UILabel! 
    @IBOutlet var showCycleTitleSwitch: UISwitch! 

    @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 { 
         name = 
     } 
     else 
     { 
      name = "" 
     } 
    } 

Ich hoffe, dies nicht zu kompliziert ist. Ich habe die var name: String = "" in der zweiten Ansicht Controller verwendet, so dass ich es verwenden kann, um die phaseLabel in der ersten Ansicht Controller zu greifen.

+0

erhalten, was das Problem, was nicht funktioniert? Bitte geben Sie eine Beschreibung des gewünschten Verhaltens und des tatsächlichen Verhaltens in Ihrer Frage an. –

Antwort

1

Hier ist, was ich tun werde: -

ich eine Variable in der Klasse definieren würde MeditationScreenViewController, die den Wert des Schalters gespeichert werden, ob es ein- oder ausgeschaltet ist.

class MeditationScreenViewController: UIViewController { 

     var isSwitchOn: Bool! 
} 

und wenn die prepareForSegue Aufruf werde ich den Schalter Wert isSwitchOn Variablen speichern, wie Sie den Zugriff auf die Klassenvariablen haben, nachdem Sie die Viewcontroller als MeditationScreenViewController werfen.

-Code wird wie folgt aussehen: -

@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 

    } 
} 
    } 
} 

schließlich in Ihrer viewWillAppear Methode in MeditationScreenViewController den Wert verwenden, das Etikett oder nicht zu verstecken.

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

Danke für die Details aber dieser Teil funktioniert nicht: wenn segue.identifier == "segue" { wenn sendToDetailViewController = segue.destination als? MeditationScreenViewController { isSwitchOn = sender.isOn } } –

+0

abstimmen und akzeptieren, wenn es :) geholfen –

+0

nicht nicht den ‚isSwitchOn‘ von den anderen Viewcontroller zu erkennen und ‚es sagt:‘ Verwendung von ungelöster Kennung ‚Segue‘. Irgendwelche Ideen wie das ist jetzt ein BOOL und kein String? Vielen Dank. –

0

Im Viewcontroller möchten Sie die Daten

//create variable to store passed data from UISwitch 
var switchStatePassed = [String]() 

//perform tasks with passed data 

Im anderen Viewcontroller

fun prepare(for segue: UIStorybordSegue, sender: Any?) { 
    //set destination to MeditationScreenViewController 
    if let destination = segue.destination as? 
    MeditationScreenViewController { 
    //check UISwitch state and create variable to store info 
    if showCycleTitleSwitch.on { 
    let switchState = "enabled" 
    } else { 
     let switchState = "disabled" 
    } 
    //send switchState to other ViewController 
    destination.switchStatePassed = switchState 
} 
Verwandte Themen